まず30秒で診断:ファイルを責める前に行数を数える
ExcelがCSVファイルを開けない、あるいは途中で切ってしまうとき、まず確認すべきはファイルに実際に何行あるかです。対処法はその数字によってまったく変わるため、推測で進めると時間を無駄にします。90万行のファイルならExcelで問題なく開けるので、原因は別にあります。区切り文字や文字コードの問題で、関連ガイドで扱っています。120万行のファイルはグリッドの制限にぶつかり、Excel内の設定ではどうにもなりません。まず数えて、その数に合った対処法を選んでください。やみくもにあれこれ試すのはやめましょう。
いちばん速い数え方は、ターミナル以外に何も使いません。WindowsならPowerShellを開いてGet-ContentとMeasure-Objectを使い、MacやLinuxならファイルにwc -lを実行すれば、改行の数を数えられます。ステータスバーに行数が表示されるテキストエディタでも数えられますが、とても大きなファイルはエディタで開くのに時間がかかることがあります。得られる数字は行数であって、データの行数ではありません。ヘッダー付きのファイルはデータの行数より1行多く、引用符の中に改行を含む値は複数行にまたがるため、行数は上限の目安であって正確な行数ではありません。ただし、ほとんどのエクスポートでは判断するには十分正確です。
正確に数えるにはPythonのcsvモジュールを使います。ファイルを1行ずつ読み込み、メモリに全部載せることはないため、表計算ソフトでは開けないほど大きなファイルでも動きます。下のスニペットは120万行のデータがあるテストファイルを数秒で数え、引用符の中の改行がなかったため行数とぴったり一致しました。2つの数が自分のファイルで食い違う場合は、csvモジュールの数を信じてください。差は改行を含む値のせいで、そのファイルに引用符で囲まれた複数行の値があることもわかり、これはこのガイドの後半で紹介する分割の手順でも重要になります。
Terminal (Mac or Linux):
$ wc -l big_sample.csv
1200001 big_sample.csv
PowerShell (Windows):
PS> (Get-Content big_sample.csv | Measure-Object -Line).Lines
1200001
Python (exact row count, one row at a time):
import csv
with open('big_sample.csv', newline='') as f:
reader = csv.reader(f)
header = next(reader)
rows = sum(1 for _ in reader)
print(header, rows)
# ['id', 'name', 'total'] 1200000
Lines minus the header row: 1,200,001 - 1 = 1,200,000 data rows.
That is 151,425 rows over Excel's limit.このテストファイルが示すことに注目してください。3列の短い値だけの120万行のCSVは、ディスク上では約32 MBしかありません。つまり問題はメガバイト単位のファイルサイズではないのです。大きなファイルといえば数百メガバイトを想像しがちですが、短い行が100万行並んだ細いファイルはディスク上では小さく、それでもグリッドには大きすぎます。重要なのは行数であってメガバイト数ではないので、数えることが最初の手順になります。ファイルが1,048,575行のデータを超えているなら、グリッド制限の問題で、このガイドの残りが当てはまります。その数未満なら問題は別にあり、1列にまとまって開く問題、文字コードの問題、先頭の0の問題についての関連ガイドを見てください。
重要な数字はひとつだけ:1,048,576行
Excelは1つのワークシートに最大で1,048,576行、16,384列までしか入らず、1つのセルに入る文字数は最大で32,767文字です。これらは現在の表計算ファイル形式の公開されている制限で、長年変わっていません。ヘッダー行も1,048,576行のうちの1行として数えられるため、ヘッダー付きのCSVファイルは1シートに最大で1,048,575行のデータまでしか入りません。データが1,048,576行にヘッダーを加えたファイルは1行オーバーで、Excelは途中で切ります。古い.xls形式はさらに小さく、1シートあたり65,536行です。古いシステムから来たファイルなら形式も確認してください。ただし、最新のExcelで開く.csvファイルについては、1,048,576がその数字です。
CSV形式そのものには、制限はまったくありません。CSVファイルはただのテキストで、行は改行で区切られ、値は区切り文字で区切られており、形式の説明であるRFC 4180には行数、列数、バイト数の上限について何も書かれていません。CSVファイルはディスクの空きがある限り何行でも入れることができ、このガイドのテストファイルは120万行を32 MBで問題なく保持しています。制限はファイルを開く側のものが決めるもので、ファイル自体が決めるものではありません。だからこそ、同じファイルがテキストエディタやデータベースでは全部開けて、Excelでは途中で切れるのです。ファイルや、それをエクスポートしたプログラムを責めるのは筋違いです。エクスポート側は仕事を果たしており、天井があるのは読み込む側です。
実際には、ほかにも2つの数字が問題を左右します。1つ目は列数です。16,384列は十分に多く、実際のCSVがそこに近づくことはほとんどないため、列数が制限になることはめったにありません。2つ目はメモリです。Excelは表示する行をメモリに読み込むため、行数が制限内でも、幅の広い行が並んだファイルでは動作が重くなったり、落ちたりすることがあります。短い値が100万行並んだファイルはすんなり開けますが、長いテキストの値が100万行並んだファイルは開けないこともあるため、1,048,576は厳密な上限、幅の広い行が数十万行ある場合はそれが実用上の上限だと考えてください。ファイルが大きくて動作も遅い場合、このガイドの分割の手順は2つの意味で役に立ちます。小さなファイルは速いファイルだからです。
ファイルが大きすぎるとき、Excelは実際に何をするのか
グリッドに入りきらない行数があるCSVファイルを開くと、Excelはファイルを開くことを拒みません。最初の1,048,576行をヘッダー込みで読み込み、データセットがグリッドに対して大きすぎるため、読み込まれなかったデータはブックを保存すると失われるという警告を表示します。Microsoftのサポートページも、どの言語でもまったく同じ言い回しです。データセットがExcelで利用できる行数を超えているため、一部のデータが読み込まれませんでした。残りの行はディスク上のファイルにそのまま残っていますが、ブックには入っておらず、画面上ではどの行が欠けているかは数以外に何も教えてくれません。
危険なのは、黙って欠ける部分です。ブックは完全に見えます。ヘッダーがあり、シートの一番下まで行が並んでいて、欠けた行はすき間も目印もなく、ただ存在しないだけです。そのブックで並べ替えや絞り込み、グラフ作成をすると、部分的なデータセットで作業していることになり、結果は間違いますが、最初の100万行は代表的に見えることが多いため、間違いに気づきにくいのです。途中で切れたブックから計算した合計、平均、件数はすべて過小になり、誤差は制限を超えた行が増えるほど大きくなります。120万行のファイルはデータの約8分の1を黙って失い、500万行のファイルは5分の4を失いながら、画面上はまったく同じに見えます。
破壊的なのは、保存するときです。途中で切れたブックを保存すると、Excelが読み込んだ行だけが書き戻されるため、グリッドに入らなかった行は保存後のファイルから永久に消えます。保存をめぐる往復については、関連ガイドで詳しく扱っていますが、ここでのルールは絶対です。グリッド制限について警告を出したブックから、元のCSVに上書き保存してはいけません。すでに唯一のコピーに上書きしてしまった場合は、OneDriveやSharePointのバージョン履歴、バックアップ、メールに添付されたファイル、ファイルの出どころのシステムを確認してください。保存後のファイルに欠けた行はもうなく、どんな数式でも取り戻せません。途中で切れたブックは保存せずに閉じて、元のファイルから下の対処法のいずれかでやり直してください。
アプリごとの制限:Excel、Google スプレッドシート、LibreOffice、そして制限のないツール
すべてのプログラムが同じところで止まるわけではないので、別のプログラムを使うこと自体が正しい対処法になることもあります。Excelは1つのワークシートあたり1,048,576行、16,384列で止まります。LibreOffice Calcも1,048,576行で止まりますが、列は1,024列までしかないため、幅の広いファイルにも役に立ちません。Apple Numbersはファイルが約100万行を超えると警告を出すため、同じ部類です。Google スプレッドシートは行数ではなくセル数を数えます。スプレッドシートに入るセルは最大で2,000万セルで、CSVの読み込みにも100 MBの上限があるため、細いファイルはExcelより多くの行を入れられますが、幅の広いファイルは逆に少なくなります。正確な行数の上限は列数によって決まります。10列のファイルならGoogle スプレッドシートに約200万行入りますが、50列のファイルは約40万行しか入りません。
テキストエディタには、自分の行数の上限はありません。あるのは使うパソコンのメモリだけなので、大きなCSVもメモ帳やテキストエディット、VS Codeではただのテキストとして全部開け、検索したり、最初と最後の行を読んだり、ヘッダーを確認したりできます。ただし、表計算ソフトのように並べ替えや絞り込みはできません。そのためテキストエディタは大きなファイルの中身を確認するのに適したツールで、分析には向いていません。Pythonとそのcsvモジュールにも行数の上限はなく、あるのはメモリだけです。csvモジュールは1行ずつ読むため、どんな表計算ソフトでも開けないほど大きなファイルでも、ほとんどメモリを使わずに数えたり、絞り込んだり、分割したりできます。データベースの方法には実用上の行数の上限はまったくありません。CSVをSQLiteやPostgres、デスクトップのデータベースに読み込めば、100万行は小さなテーブルにすぎません。
実用的なルールは、たまたま開いているツールにファイルを無理に押し込むのではなく、作業に合ったツールを選ぶことです。データを見るだけならテキストエディタを使います。絞り込んだり分割したりするならスクリプトを使います。すべてをグリッドで分析するなら、下のデータモデルの対処法か、データベースを使います。必要なのが概要だけなら、スクリプトでファイルを集計して、小さな概要をExcelで開きます。ファイルに問題はなく、表計算ソフトが壊れているわけでもありません。100万行のデータセットと100万行のグリッドの不一致が問題で、対処法はグリッドにその容量以上を求めるのをやめることです。
対処法1:Excelで開ける大きさにファイルを分割する
分割は、データを通常のワークシートに入れたいときにまず試すべき対処法です。単純で、Python以外に何もいらず、すべてのかたまりがヘッダー付きでExcelで普通に開けるからです。手順は、ファイルを1行ずつ読み、1つのかたまりに最大で1,048,575行のデータまで書き、すべてのかたまりの先頭にヘッダー行を繰り返すことです。1,048,576ではなく1,048,575を使うのは、ヘッダーも1行として数えられるためで、データが1,048,576行のかたまりにヘッダーを加えると、また1行オーバーになるからです。下のスクリプトはまさにそれを行うもので、Pythonの標準ライブラリだけを使うため、インストールするものは何もありません。
このスクリプトは、診断の節で使った120万行のサンプルファイルで検証済みです。ディスク上では32 MBです。結果は2つのかたまりになりました。1つ目はヘッダーに1,048,575行のデータを加えた、ちょうど1,048,576行です。2つ目はヘッダーに残りの151,425行のデータを加えたものです。2つ目のかたまりから繰り返されたヘッダーを取り除いてつなぎ直すと、元のファイルとバイト単位で完全に一致しました。ファイルのハッシュを比べることで確認しています。つまり分割では何も失われず、何も変わりません。500万行のファイルも同じ方法で5つのかたまりになり、1,000万行のファイルは10個のかたまりになり、上限はディスクの空きだけです。
分割するときに重要な点は2つあります。1つ目は、すべてのかたまりにヘッダーを入れることです。ヘッダーのないかたまりは、最初のデータ行がヘッダーとして開かれ、列名が消えてしまいます。2つ目は、Excelで開いて行を手でコピーして分割してはいけないことです。手作業のコピーは途中で切れたブックから始まるため、制限を超えた行はすでに欠けており、コピーに含めることはできません。Excelが触れる前に、ディスク上の元のファイルからスクリプトで分割してください。かたまりができたら、1つずつ開いて作業し、元のファイルは別に保管してください。かたまりは作業用のコピーで、完全なコピーは元のファイルだけです。
import csv
LIMIT = 1_048_575 # data rows per chunk (header counts as a row)
with open('big.csv', newline='') as f:
reader = csv.reader(f)
header = next(reader)
chunk = 0
count = 0
out = open(f'chunk_{chunk}.csv', 'w', newline='')
writer = csv.writer(out)
writer.writerow(header)
for row in reader:
if count == LIMIT:
out.close()
chunk += 1
count = 0
out = open(f'chunk_{chunk}.csv', 'w', newline='')
writer = csv.writer(out)
writer.writerow(header)
writer.writerow(row)
count += 1
out.close()
print(f'split into {chunk + 1} chunks')
# Verified on a 1,200,000-row file (32 MB):
# chunk_0.csv = 1,048,576 lines (header + 1,048,575 rows)
# chunk_1.csv = 151,426 lines (header + 151,425 rows)
# Rejoining the chunks (header stripped from chunk 1 onward)
# reproduced the original file byte-identically.分割には、もう1つ触れておくべき利点があります。かたまりはそれぞれ独立したファイルなので、同僚に1つのかたまりを渡したり、遅いパソコンで1つのかたまりを開いたり、かたまりを並行して処理したりできます。表計算ソフトでは開けない1つのファイルでは、どれもできません。ファイルが毎週大きくなるなら、スクリプトを保管して、新しいエクスポートが出るたびに実行してください。毎回手で分割する必要はありません。データを送るために分割する場合は、かたまりが作業用のコピーであることを覚えておいてください。保管するのは元のファイルで、開くのはかたまりです。
対処法2:Power Queryでファイル全体をデータモデルに読み込む
分割は通常のワークシートが必要なときにうまくいきますが、データセット全体を一度に分析したいこともあります。そのためのExcelのもう1つの入り口がデータモデルです。Power Queryを使えば、CSVファイルをグリッドではなくデータモデルに読み込むことができ、データモデルは圧縮を使ってメモリに数千万行を保持し、1,048,576行というグリッドの制限をはるかに超えます。すべての行をシート上で見ることはできません。表示できるものにもグリッドの制限がかかるからです。しかし、データセット全体に対するピボットテーブルやピボットグラフを作ることができ、集計にはグリッドでは決して表示できない行も含め、すべての行が数えられます。1行ずつ見るのではなく、概要や合計、ピボットが知りたいときに適した対処法です。
手順は、Windows版Excelではわざと退屈なほど単純です。空のブックを開き、データ、データの取得、ファイルから、テキストまたはCSVからの順に進み、ファイルを選んで、プレビューで読み込み先を選び、テーブルへの読み込みではなく、接続のみを作成を選び、データをデータモデルに追加するにチェックを入れます。次にデータモデルからピボットテーブルを作ると、ピボットはデータセット全体を読み込みます。グリッドに対して大きすぎるデータセットについてMicrosoftが公開している案内も、まさにこの方法を説明しており、元のファイルに上書き保存しないよう、ここでも警告しています。誤ってテーブルに読み込んだ場合、グリッドには最初の行しか入らないからです。
ここでは2つの注意点を、はっきり述べておきます。1つ目は、データモデルの方法にはPower Queryを備えたWindows版Excelが必要で、Mac版Excelではデータモデルの作成と利用の対応が限られているため、Macの利用者はWindowsで実行するか、代わりに分割の手順を使う必要があるかもしれないことです。2つ目は、データモデルに対するピボットテーブルは集計の質問に答えるもので、行の質問には答えないことです。ファイル全体の合計、件数、グループ分けはできますが、300万行目をシート上でスクロールして見ることはできません。シートはやはり1,048,576行で止まるからです。制限を超えた個々の行を見る必要があるなら、ファイルを分割してください。すべての行に対する合計が必要なら、データモデルを使ってください。
対処法3:必要な行だけを見る
たいていの場合、実際には100万行すべてを一度に画面に表示する必要はありません。必要なのは、ある顧客、ある月、ある地域、あるエラーコードの行だけで、ファイルの残りは読むことのない背景情報です。開く前にファイルに絞り込みをかけるのは、分割するより速く、Excelで普通に開ける小さなファイルができあがり、管理するかたまりもありません。絞り込みは1行ずつ読むスクリプトで実行するため、どんな大きさのファイルでも動き、出力は独自のヘッダー付きの完全なCSVファイルで、そのまま開けます。
下の手順はPythonの標準ライブラリだけを使い、同じ120万行のサンプルファイルで検証済みです。合計の列が90より大きい行だけを残すと、74,227行のファイルができ、そのうちデータは74,226行で、約2秒で終わりました。最初に残された行は、想定どおり、合計が初めて90を超える行です。条件は自分の質問に合わせて変えてください。日付の範囲、顧客名、ステータスの値など、出力はファイルのうち実際に必要な部分です。同じやり方は、最初のN行にも使えます。headコマンドや、N行で止まるカウンターで取り出せます。最後のN行にはtailコマンドを使い、ファイルの終わりを確かめたいときに使います。
絞り込みは、そのファイルを開く価値があるかどうかという問いにも答えます。まず条件に合う行数を数え、数が少なければ、絞り込んだファイルを開きます。数がまだグリッドの制限を超えているなら、さらに絞り込むか、代わりに集計します。月別、顧客別、ステータス別にファイルをまとめ、概要を開けば、100万行ではなく数百行になります。概要はたいてい、実際に求められている成果物でもあり、同僚が実際に開けるファイルでもあります。結果をほかの人に送るときは、そのことを覚えておいてください。
import csv
kept = 0
with open('big.csv', newline='') as src, \
open('filtered.csv', 'w', newline='') as dst:
reader = csv.DictReader(src)
writer = csv.DictWriter(dst, fieldnames=reader.fieldnames)
writer.writeheader()
for row in reader:
if int(row['total']) > 90:
writer.writerow(row)
kept += 1
print(f'kept {kept} rows')
# Verified on the 1,200,000-row sample file:
# kept 74226 rows -> filtered.csv has 74,227 lines
# First kept row: 91,Customer 91,91
# The script reads one row at a time, so memory stays flat
# no matter how large the file is.絞り込みがファイルそのものについて示すことに注目してください。この手順ではファイルがどれだけ大きくても関係ありません。スクリプトが一度に保持するのは1行だけだからです。これが、流れを扱うために作られたツールと、グリッドのために作られたツールの違いです。表計算ソフトは表示するものをすべて一度にメモリに読み込むため、制限があります。流れを扱うスクリプトは1行を処理し、書き込むか捨てるかを決めて次に進むため、実用上の制限がありません。ファイルがグリッドに対して大きすぎるときは、まず流れを扱うツールを使い、グリッドでは小さな結果だけを開いてください。
対処法4:作業に合ったツールを使う
グリッドの制限に繰り返しぶつかるなら、正直な答えは、表計算ソフトがそのデータセットに合ったツールではない、ということかもしれません。Excelの中でいくら工夫しても変わりません。大きなファイルの中身を確認するにはテキストエディタが適したツールです。ファイル全体をテキストとして開き、値を検索でき、最初と最後の行を表示でき、行数の制限はメモリだけです。大きなファイルを分析するにはデータベースが適したツールです。CSVをSQLiteに読み込めば、サーバーなしでパソコン上の1つのファイルになり、100万行はSQLで検索、絞り込み、集計できる小さなテーブルになります。グリッドはどこにもありません。
どちらのツールを選ぶかは、質問によって決まります。質問がファイルの中身についてなら、テキストエディタを使います。質問が条件に合う行についてなら、絞り込みスクリプトを使います。質問がファイル全体の合計やピボットについてなら、データモデルかデータベースを使います。質問が数行を一度だけ見ることについてなら、ターミナルでheadとtailを使います。データが表計算ソフトに入るべきなのは、行ごとに編集するのが目的の一部についてだけで、その場合も分割や絞り込みで収まる大きさにしたものだけです。100万行のデータセットを100万行のグリッドに無理に押し込むのは、データセットのせいではなく、組み合わせの間違いです。
ここには、こうしたファイルを作る人への計画の話もあります。毎週CSVをエクスポートしていて、行数が100万行を超え続けるなら、毎回すべての履歴をエクスポートするのをやめ、新しい行だけ、あるいは概要だけをエクスポートするか、月ごとに分割してエクスポートしてください。表計算ソフトに入るエクスポートは、人々が実際に使えるエクスポートです。誰も開けないエクスポートは、どれだけ完全でも成果物ではありません。受け取る人にファイル名や、ファイルに添えた1行のメモで行数を伝えてください。誰も、途中で切れた保存でデータを失ってから制限に気づく必要はありません。
うまくいかない対処法4つ
うまくいく対処法の前に、うまくいかない対処法を4つ片づけておく価値があります。どれも時間を無駄にし、そのうち1つはデータを破壊するからです。1つ目は、ファイルをZIPに圧縮することです。圧縮するとディスク上のファイルは小さくなります。CSVのテキストはよく圧縮されるため、劇的に小さくなることもあります。しかし、解凍したり読み込んだりした瞬間、生データは同じ行数のままで、Excelはやはり1,048,576行で止まります。圧縮が変えるのは保存容量であって行数ではなく、グリッドの制限は行数を数えるもので、メガバイト数を数えるものではありません。
2つ目は、ファイルを.xlsxとして保存すること、あるいは誰かに変換してもらうことです。.xlsx形式も、Excelで開いたCSVと同じ1,048,576行というグリッドの制限があります。制限はワークシートのもので、ファイル形式のものではないため、ファイルを変換しても、1シートに入る行数は何も変わりません。3つ目は、Google スプレッドシートでファイルを開き、セルの制限に期待することです。Google スプレッドシートは行数ではなく2,000万セルを数えるため、細いファイルはExcelより多くの行を入れられますが、幅の広いファイルはセルの上限に早く達します。100 MBの読み込み上限もあり、500万行のファイルはGoogle スプレッドシートでも入りきらないため、この対処法がうまくいくのは、Excelの制限をわずかに超えたファイルだけで、本当に大きなファイルには使えません。
4つ目は、Excelの中で行を新しいシートや新しいブックにコピーして、ファイルを手で分割することです。これは途中で切れたブックから始まるため、制限を超えた行はすでに欠けており、コピーに含めることは決してできません。手作業のコピーは遅く、間違いが起きやすく、Excelが読み込んだ行だけしか扱えません。上の手順のように、Excelが触れる前に、ディスク上の元のファイルからスクリプトで分割してください。そして、データを破壊する対処法は、単に失敗するのではなく、途中で切れたブックから元のファイルに上書き保存することです。これにより読み込まれなかった行が永久に消えます。保存については、関連ガイドでくわしく説明しています。
このページの変換ツールから出てくるファイルについて
このページの変換ツールは、まさにこのガイドで扱う種類のファイルを生み出すため、その動作を推測ではなく、実際のコードで検証したうえではっきり述べておく価値があります。変換エンジンはこのパソコンで、1万行のJSONサンプルを使って実行され、28ミリ秒で終わり、1万行と3列を出力しました。10万行のサンプルでは218ミリ秒で終わり、2.35 MBのCSVを出力しました。このシリーズの以前の実行では、10万行が約0.4秒、50万行がエンジン時間で約1.4秒と測定されており、変換ツール自体は大きなファイルも余裕で扱え、ボトルネックは結果を開くプログラムであって、変換ではありません。
この区別は重要です。問題をどこで直すかが決まるからです。変換したファイルがExcelで全部開けない場合、変換が失敗したのでも、ファイルが壊れたのでもありません。ファイルはすべての行をバイト単位で完全に保持しており、Excelがそのうち最初の1,048,576行だけを読み込んだのです。このガイドの冒頭の手順で行数を確かめ、ファイルが制限を超えているなら、上のスクリプトで分割するか、Power Queryでデータモデルに読み込むか、必要な行だけに絞り込んでください。違う結果を期待して再度変換しても、変換ツールは同じ完全なファイルを出し、Excelは同じように途中で切るため、意味がありません。
変換ツールについて、もう1つ重要な点があります。ダウンロードされるのはバイト順マークのない、素のUTF-8で、ほとんどのツールにとって最もすっきりした形であり、変換ツールではダウンロード前に区切り文字を選べます。どちらの選択も行数の制限にはまったく影響しません。セミコロン区切りのファイルは、カンマ区切りのファイルとまったく同じ行で途中で切れます。UTF-8のファイルも、古い文字コードのファイルとまったく同じ行で途中で切れます。変換したファイルが1列にまとまって開いたり、文字化けしたりする場合は、それらは別の問題で、別の対処法があり、下にリンクした関連ガイドで扱っています。同じ読み込みでまとめて直すこともできます。開き方を直し、必要ならファイルを分割し、Excelからダウンロードしたファイルに上書き保存してはいけません。
Engine check, run on this machine (2026-11-09):
10,000 rows -> 28 ms, 3 columns, 226,762 bytes
100,000 rows -> 218 ms, 3 columns, 2.35 MB
Sample output, first rows:
id,name,total
1,Customer 1,1
2,Customer 2,2
Earlier verified timings in this series:
100,000 rows / 10 MB JSON in about 0.4 s
500,000 rows / 25 MB JSON in about 1.4 s engine time
The converter finishes in milliseconds. The file it writes
is complete. Excel is the bottleneck, not the conversion.必要なファイルが変換後の出力そのもので、それがExcelには大きすぎる場合、いちばんすっきりした方法は、巨大なCSVを1つ保管して毎回分割するのではなく、JSONを保管して、必要になるたびに新しく変換することです。JSONが元データで、CSVはその時点の写しです。元データから作り直すことは、表計算ソフトをすでに通ったファイルを直すより、常にすっきりしています。これは、保存についての関連ガイドが勧める、元のファイルを大切にする習慣を、大きなファイルにも当てはめたものです。元データを保管し、必要なものをエクスポートし、エクスポートしたものを分割または絞り込み、元データは分割も絞り込みもしないでください。
予防チェックリスト:人が実際に開けるCSVを作る
行数の制限は、書き手と読み手の不一致です。そのため予防とは、書き手が大きさを宣言し、読み手が信じる前に確認することです。CSVを作るときも受け取るときも、このチェックリストをひととおり確認すれば、次に触る人はこのガイドを必要としなくなります。1つ目、ファイルを送る前に行数を数え、ファイル名か、ファイルに添えた1行のメモに数を入れてください。受け取る人は開く前に、ファイルが表計算ソフトに入るかどうかわかります。customers-2026-11-09-1200000-rows.csvというファイル名は読み手に警告しますが、customers.csvという名前は警告しません。
2つ目、エクスポートが制限を超えそうなときは、元データの側で分割してください。データがデータベースから来るなら、月ごとや地域ごとにエクスポートし、それぞれのファイルが単独でグリッドに入るようにします。すべての履歴を、誰も開けない1つのファイルにエクスポートするのをやめてください。3つ目、元データを保管してください。JSONでも、データベースでも、ブックでもかまいません。途中で切れたり上書き保存されたりしたファイルは、直すのではなく、きれいに作り直せます。4つ目、途中で切れたブックから元のファイルに上書き保存してはいけません。受け取ったすべてのファイルは、表計算ソフトに上書きさせる前に、テキストエディタで確認するか、行数を数えてください。
5つ目、受け取る人にファイルの開き方を伝えてください。ファイルには120万行あり、このガイドのスクリプトで分割するか、Power Queryでデータモデルに読み込んでください、という1行のメモを添えるだけで、この種の問題はすべて防げます。添えるのに何もかかりません。CSVの怖い話のほとんどは、途中で切れたファイルが唯一のコピーだったことや、概要が部分的なデータセットから計算されていたことに、遅すぎるタイミングで気づくことで終わります。まず数え、開く前に分割または絞り込みを行い、元のファイルを安全に保管すれば、大きなCSVは再び普通のファイルになります。
関連ガイド
よくある質問
CSVファイルからExcelで開ける行数は何行ですか。
1つのワークシートあたり最大で1,048,576行で、ヘッダーも含まれます。そのため、ヘッダー付きのファイルは最大で1,048,575行のデータまでしか入りません。古い.xls形式は1シートあたり65,536行しか入りません。制限はワークシートのもので、CSV形式のものではありません。CSV形式自体に行数の制限はないため、同じファイルがテキストエディタやデータベースでは全部開けます。
Excelがデータセットがグリッドに対して大きすぎると言うのはなぜですか。
ファイルの行数がワークシートに表示できる行数を超えているからです。Excelは最初の1,048,576行を読み込み、データセットがグリッドに対して大きすぎて、保存すると読み込まれなかったデータが失われるという警告を出し、残りの行はファイルに残したまま、ブックには入れません。まずwc -lやPythonのスクリプトで行数を数えてから、ファイルを分割するか、データモデルに読み込むか、必要な行だけに絞り込んでください。
大きすぎるCSVをExcelで保存すると行が消えますか。
はい、消えます。途中で切れたブックを保存すると、Excelが読み込んだ行だけが書き戻されるため、1,048,576行を超えた行は保存後のファイルから永久に消えます。グリッド制限について警告を出したブックから、元のファイルに上書き保存してはいけません。保存せずに閉じて、欠けた行は元のファイル、バックアップ、OneDriveのバージョン履歴、ファイルの出どころのシステムから取り戻してください。
大きなCSVを小さなファイルに分割するにはどうすればよいですか。
ファイルを1行ずつ読むスクリプトを使い、1つのかたまりに最大で1,048,575行のデータまで書き、すべてのかたまりの先頭にヘッダーを繰り返します。このガイドのPythonスクリプトは、検証済みの120万行のファイルを2つのかたまりに分割し、つなぎ直すと元のファイルとバイト単位で完全に一致しました。Excelの中で行をコピーして分割してはいけません。制限を超えた行はブックからすでに欠けているからです。
Excelで開けないCSVファイルをGoogle スプレッドシートで開けますか。
場合によります。Google スプレッドシートは行数ではなくセル数を数え、1つのスプレッドシートの上限は2,000万セルで、読み込みの上限は100 MBです。そのため、細いファイルはExcelより多くの行を入れられますが、幅の広いファイルは少なくなります。10列のファイルはGoogle スプレッドシートに約200万行入りますが、50列のファイルは約40万行しか入りません。500万行のファイルはGoogle スプレッドシートでも入りきらないため、本当に大きなファイルは分割するか、データベースを使ってください。
Power Queryで100万行を超えるCSVを開けますか。
はい、グリッドではなくデータモデルに読み込めば開けます。Windows版Excelでは、データ、データの取得、ファイルから、テキストまたはCSVからの順に進み、読み込み先で接続のみを作成とデータをデータモデルに追加するを選びます。そうすれば、データセット全体に対するピボットテーブルを作れます。グリッドに表示できるのはやはり最大で1,048,576行までで、Mac版Excelのデータモデル対応は限られているため、Macの利用者は分割の手順が必要になる場合があります。
このページのJSONからCSVへの変換ツールは大きなファイルを扱えますか。
はい、扱えます。変換エンジンはこのパソコンで検証済みです。1万行は28ミリ秒で変換され、10万行は218ミリ秒で変換されました。以前の検証済みの実行では、50万行がエンジン時間で約1.4秒でした。変換ツールはすべての行を含む完全なCSVを書き出します。結果がExcelで全部開けない場合、ファイルに問題はなく、Excelがボトルネックです。ファイルを分割するか、データモデルに読み込むか、必要な行だけに絞り込んでください。
新しく変換して、Excelに入りきらなければ分割する
このページの変換ツールにJSONを貼り付け、すべての行をそのまま書いた、きれいなCSVをダウンロードしてください。ファイルに1,048,575行を超えるデータがある場合、Excelでは1シートにすべてを表示できないため、このガイドのスクリプトで分割するか、データモデルに読み込んでください。アップロードなし、登録なし、ブラウザのタブから何も出ていきません。
JSONからCSVへの変換ツールを開く