Excelで開けない大きなCSVファイルを開く方法(104万行の上限対策)
Excelのワークシートに入るのは最大1,048,576行・16,384列です。そのため、300万行の書き出しデータはそもそも収まりません。Excelは先頭部分だけを読み込んで警告を出し、残りは置き去りにします。ファイル全体を見るには、CSVビューアのようにこの上限がないツールで開くか、シートではなくExcelのデータモデルに読み込むか、ファイルを分割するか、Pythonやデータベースで分析しましょう。
Excelがファイルを途中で切り捨てる理由
CSVファイル自体にはサイズの上限がありません。1行が1レコードで、値をカンマやセミコロンで区切っただけのテキストです(初めて聞く方はCSVファイルとはをご覧ください)。ところがExcelは、開いたものをすべてワークシートに入れます。ワークシートのマス目は固定で、1,048,576行×16,384列(XFD列まで)です。
ファイルがこのマス目より大きいと、Excelはファイルが完全には読み込まれなかったという警告を表示し、収まる行だけを残します。見出し行と1,048,575行のデータは入りますが、1,048,577行目以降は画面上から消えてしまいます。
Google スプレッドシートも逃げ道にはなりません。1つのスプレッドシートあたり、全シート合計で1,000万セルという上限があります。300万行×10列のファイルなら、それだけで3,000万セルになるので、インポートもできません。
本当の危険:保存するとデータが失われる
警告はクリック1つで閉じられ、画面に残ったものはごく普通の表に見えます。危険はそのあとにやってきます。
- ファイルを保存する。 Excelは読み込んだ分だけを書き戻します。
export.csvで上書き保存すると、元の300万行が約100万行に置き換わり、それ以上の警告はありません。 - 合計を計算する。 切り捨てられたシートで
SUMやピボットテーブルを使うと、もっともらしいのに間違った答えが出ます。データの3分の2が届いていないからです。 - 共有する。 保存したコピーを受け取った同僚には、行が欠けていることを知る手段がありません。
Excelがすでに警告を出しているなら、保存せずにファイルを閉じ、元の書き出しファイルには手を付けないでください。そのうえで、実際の大きさを確認してから対処法を決めましょう。
方法1:ブラウザでファイル全体を開く
いくつかのレコードを確認する、顧客を探す、ある列に何が入っているかを見るなど、主にデータを見るだけなら、マス目の上限がないビューアが一番の近道です。
Opener の CSVビューアはファイルをブラウザ内で読み込み、アップロードは一切しません。顧客データや財務データを含む書き出しファイルでは、これが重要です。解析はバックグラウンドのスレッドで行われ、画面上の行だけが描画されるので、20万行のファイルなら約1秒で開き、数百万行のファイルも一般的なノートPCで扱えます。実質的な上限は決まった行数ではなく、端末のメモリです。
開いたあとは、次のことができます。
- 入力に合わせて全列を検索する
- 任意の列で並べ替える
- 絞り込み・並べ替えをした現在の表示を、きれいなUTF-8のCSVやJSONで書き出す
最後の機能は便利な裏技になります。300万行をある地域に関係する4万行に絞り込んで書き出せば、その小さなファイルは警告なしでExcelで開けます。ただし、ビューアでは数式、ピボットテーブル、グラフは使えません。それが必要なら、続きをお読みください。
方法2:Excelのデータモデルに読み込む
最近のデスクトップ版Excelでは、CSVを直接開く代わりに、Power Query(「データ」タブの「データの取得」や「テキストまたはCSVから」)でインポートできます。違いは、データの行き先です。
結果をワークシートに読み込むのではなく、接続のみを作成してデータモデルに追加する方法を選びます。データモデルはマス目の外にデータを圧縮して保存するので、1,048,576行の上限に縛られません。そのうえでピボットテーブルを作れば、300万行すべてを、月ごとの合計やカテゴリごとの件数などに集計できます。
その代わり、通常のシートのように行をスクロールして眺めることはできません。また、メニューの正確な表記はExcelのバージョンによって異なります。Excelから離れられず、最終的に必要なのが1行ずつの表示ではなく集計結果であれば、これが最良の方法です。
方法3:コマンドラインで件数確認・プレビュー・分割する
macOS、Linux、またはWSLを使ったWindowsなら、いくつかの標準コマンドで「どのくらい大きいのか」「何が入っているのか」が、ファイルをどこにも読み込まずに数秒でわかります。
wc -l export.csv # 行数
head -n 20 export.csv # 先頭の20行
head -n 100000 export.csv > sample.csv # 試すための小さなサンプル
wc -l が数えるのはレコード数ではなく行数である点に注意してください。引用符の中に改行を含む値(住所やコメントによくあります)があると、行数はレコード数より多くなります。
Excelで開ける大きさに、それぞれ見出し行を付けてファイルを分割するには、次のようにします。
tail -n +2 export.csv | split -l 1000000 - part_
for f in part_*; do
{ head -n 1 export.csv; cat "$f"; } > "$f.csv" && rm "$f"
done
分割はざっと確認するには十分ですが、ここでも引用符内の改行に注意が必要です。split は行単位で切るので、複数行にわたる値を途中で分断してしまうことがあります。また、全体の合計が必要な場合、4つの別々のブックをまたいで作業するのは面倒です。
方法4:pandas、SQLite、DuckDBで分析する
計算、結合、集計をするなら、本格的なデータツールを使うのが正直な答えです。どれも普通のノートPCで数千万行を扱えます。
Pythonのpandasは、ファイル全体をメモリに読み込みます。
import pandas as pd
df = pd.read_csv("export.csv")
print(len(df))
print(df.groupby("region")["amount"].sum())
ファイルがメモリより大きい場合は、分割して読み込みます。
total = 0
for chunk in pd.read_csv("export.csv", chunksize=500_000):
total += chunk["amount"].sum()
DuckDBは、事前にインポートしなくても、CSVファイルに直接SQLで問い合わせできます。
SELECT region, COUNT(*) AS orders, SUM(amount) AS revenue
FROM 'export.csv'
GROUP BY region
ORDER BY revenue DESC;
SQLiteは多くのシステムに最初から入っていて、データを問い合わせ可能な1つのファイルにまとめておきたいときに便利です。
sqlite3 sales.db
sqlite> .mode csv
sqlite> .import export.csv sales
sqlite> SELECT COUNT(*) FROM sales;
重い処理はここで済ませ、数千行程度の小さな集計結果をCSVに書き出して、Excelやレポートで使うのがおすすめの流れです。
よくある質問
Excelの行数の上限を増やせますか?
できません。1,048,576行という上限は、すべてのワークシートで固定されています。データモデルに読み込む、ファイルを分割する、別のツールを使うといった回避策しかありません。
ファイルが切り捨てられたかどうかは、どうすればわかりますか?
Excelはファイルを開くときに警告を出します。また、データがちょうど1,048,576行目で終わっているシートは、切り捨てられた可能性が高いサインです。確実に知りたいなら、wc -l で元のファイルの大きさを確認するか、総行数が表示されるCSVビューアで開いてみてください。
Google スプレッドシートやLibreOfficeなら開けますか?
たいていは開けません。Google スプレッドシートは1つのスプレッドシートあたり1,000万セルが上限で、LibreOffice Calcにもシートあたりの最大行数が決まっています。どちらも小さめのファイルなら問題ありませんが、数百万行の書き出しデータには、ビューア、データベース、スクリプトが必要です。
大きな顧客データをブラウザのツールで開いても安全ですか?
ツールによります。オンラインの変換ツールの多くは、ファイルをサーバーにアップロードします。Opener はファイルをブラウザ内で読み込み、どこにも送信しないので、データは端末にとどまります。