ガイド

Excelで開けない大きなCSVファイルを開く方法(104万行の上限対策)

Opener チーム8 分で読めます

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がすでに警告を出しているなら、保存せずにファイルを閉じ、元の書き出しファイルには手を付けないでください。そのうえで、実際の大きさを確認してから対処法を決めましょう。

方法1:ブラウザでファイル全体を開く

いくつかのレコードを確認する、顧客を探す、ある列に何が入っているかを見るなど、主にデータを見るだけなら、マス目の上限がないビューアが一番の近道です。

Opener の CSVビューアはファイルをブラウザ内で読み込み、アップロードは一切しません。顧客データや財務データを含む書き出しファイルでは、これが重要です。解析はバックグラウンドのスレッドで行われ、画面上の行だけが描画されるので、20万行のファイルなら約1秒で開き、数百万行のファイルも一般的なノートPCで扱えます。実質的な上限は決まった行数ではなく、端末のメモリです。

開いたあとは、次のことができます。

最後の機能は便利な裏技になります。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 はファイルをブラウザ内で読み込み、どこにも送信しないので、データは端末にとどまります。