CSV

CSVファイルとは

プレーンテキストで書かれた表。どの表計算ソフトも、どのデータベースも、どの分析ツールも読めます。ひとつ注意:日本語版 Excel はダブルクリックで開いた .csv を CP932 として読むので、UTF-8 のこのファイルは文字化けします。開くのではなく「データ」タブから読み込んでください。

CSV とは何か

CSV はプレーンテキスト形式です。どのエディターでも開けます。 プログラム間のデータ受け渡しのために使われます。

拡張子は .csv、正式名称は Comma-Separated Values です。ただしどちらも、そのファイルが中に何を持てるかほどには多くを語りません。このページの残りは、その中身についての話です。

CSV はどこから来たのか

1972 年までさかのぼります。 仕様は RFC 4180 です。

これだけ長く読まれ続けてきた形式なら、10 年後に取り出したいものを預けても大丈夫です。

仕様は公開されています

仕様書がそのまま公開されているので、中身を推し量るのではなく文書を読んで実装できます。この形式が数多くのプログラムに載っているのはそのためであり、20 年前に書かれたファイルが今も開けるのもそのためです。ただし「仕様が公開されている」ことと「使用料が要らない」ことは別の話です。中でコーデックを包んでいる形式では、特許のライセンスは仕様書が答えていない別の問題として残ります。

捨てられるものはありません

CSV ファイルは中身をそのまま保存します。保存し直しても何も変わらないので、開いて、直して、また保存する——それを何度繰り返しても劣化は積み上がりません。これが、渡すための形式ではなく作業のための形式である理由です。

コメントを書く場所がありません

CSV ファイルにはコメントを書く方法がありません。説明にあたるものはすべてファイルの外に置くことになります。人が手で面倒を見る用途にこれを選ぶ前に、知っておくべきことです。

CSV を開けるのは何か

Microsoft Excel、LibreOffice Calc、pandasが読めますし、同じ種類のプログラムならたいてい読めます。

ファイルが開かないとき、形式が悪いことはめったにありません。たいていはプログラムのほうが形式より古いのです。もっと古い形式に変換してしまうのが確実な逃げ道で、このサイトの残りの部分はそのためにあります。

ブラウザーで開く

これを読めるブラウザーはありません。

これを変換するいちばんよくある理由がこれです。形式が悪いのではありません。ファイルを見せたい場所が、それを読めないというだけのことです。

作業のための形式です

CSV は、開いて手を入れるために作られています。作業が続いているあいだはこの形式でファイルを持ち、完成したものが必要になるたびに、ここから書き出してください。

この形式でよく起きること

繰り返し挙がる不満はこれです。列の型が、読み込み時に伝えられるのではなく推測される。

どれも、この形式を避ける理由にはなりません。どれかに不意を突かれる前に知っておくべきことがら、というだけです。これは別の主張であり、そして役に立つほうの主張です。

一番単純に見えて、実は単純ではない形式

CSV は値をカンマで区切った行の集まりだ、という説明は、最初の値にカンマが含まれるまでは正しく成り立ちます。そこから引用符が必要になり、引用符付きの値の中に引用符自体を含める方法が必要になり、値の中に改行を含める方法も必要になります。このあたりから実装同士の食い違いが始まります。

RFC 4180 は 2005 年にこの慣習を文書化するために発行されましたが、これは万人が従うべき規格を定めたものではなく、既存の慣行を記録したものだと明言しています。二十年たった今も、多くのソフトウェアがこれに厳密には従っていません。CSV とは、一つの拡張子をまとった、ほぼ互換性のある形式の集まりだと考えるのが正直な出発点です。

実際にファイルを壊すのは引用符の扱い

カンマや引用符、改行を含む値は二重引用符で囲む必要があり、その中に引用符自体を含める場合は二つ連ねて書きます。これを正しく行えば、値には段落全体の改行を含む、どんな内容でも入れられます。

誤ると被害は静かに広がります。エスケープされていない引用符は、パーサーにファイルの残り全部を一つのフィールドとして飲み込ませてしまいます。引用符で囲まれていない住所の中のカンマは、その行だけ後続のすべての列を一つずつずらします。一万行のファイルのうち、社名にカンマが入っている十一行だけが崩れていて、エラーは何も出ないということが起こり得ます。

区切り文字はカンマとは限らない

小数点にカンマを使う国々 — 大陸ヨーロッパの多くがそうです — では、スプレッドシートはカンマの代わりにセミコロンで書き出します。「1,50」のようなファイルではそもそも解析できないためです。それでも拡張子は .csv のままです。

タブも三番目によくある区切り文字で、これが TSV という形式が存在する理由です。タブは値の中にほとんど現れないからです。CSV が一つの列にまとまって開かれてしまう場合、まず疑うべきは区切り文字です。ファイル自体は正しく、読み込み側が推測を誤っただけです。多くの取り込み画面では使う文字を指定でき、多くの書き出し画面でも選べます。

何かが決めるまでは、すべてが文字列

CSV には型という概念がありません。0、0、1、2、3 という文字がファイルの中に並んでいるだけで、それが数値の 123 になるか、文字列の「00123」になるかは、読み込む側がすべて決めます。

これが、スプレッドシートがデータを食い違えるという苦情の根本にある理由です。郵便番号の先頭のゼロが消える、商品コードが日付に化ける、長い識別子が浮動小数点の誤差で末尾の桁を失う。どれもファイルの中で起きているのではなく、開いた瞬間に起きています。対処法は、開くのではなく取り込みとして読み込み、扱いに困る列をあらかじめテキストとして指定することです。

文字エンコーディングと、目に見えない三バイト

CSV は自分の文字エンコーディングを宣言しません。UTF-8 が今ではまともな既定値で、ほとんどのソフトがこれで書き出しますが、Windows 版の Excel は歴史的に地域ごとのコードページを前提にしてきました。アクセント記号付きの文字が文字化けするのはこのためです。

よくある対処はバイトオーダーマーク、つまり Excel にファイルが UTF-8 だと伝える目に見えない三バイトを先頭に書くことです。これは効果がありますが、別の問題を生みます。多くのパーサーはこの三バイトを最初の列見出しの一部として読んでしまい、「id」との照合が静かに失敗します。両方を同時に満たす配置は存在せず、これがこの形式全体を象徴する話です。

CSV が本当に優れている点

ストリーミングです。メモリーに収まらない大きさのファイルでも、一行しか保持しないツールで一行ずつ読み進められます。データパイプラインやデータベースの取り込み、コマンドラインツールがこの形式を使う理由であり、五ギガバイトのエクスポートでも扱える理由です。

そして透明性です。テキストなので、マクロも外部リンクも他のファイルへ手を伸ばす数式も、何一つ隠せません。セキュリティを重視するシステムがワークブックではなく CSV を求めるのは、まさにこの性質のためで、単なる気休めではなく実質的な利点です。

誰でも読める CSV の書き方

ほとんどの問題は五つの習慣で防げます。バイトオーダーマークなしの UTF-8 を使うこと。区切り文字や引用符、改行を含み得るすべての値を引用符で囲むこと、あるいはすべての値を引用符で囲んでしまうこと。これは仕様上問題なく、手間もわずかです。分かりやすく短い名前のヘッダー行を用意すること。日付は年から始める ISO 形式で書き、これなら正しく並べ替えられ、アメリカ式とヨーロッパ式のどちらとも取り違えられません。そしてカンマ以外の区切り文字を使ったなら、それを明記することです。

これらはどれも仕組みとして強制されるものではないため、意識して行う価値があります。この五つの原則に従った CSV は、受け取るどんなツールでも正しく開けます。

基本情報

CSVフォーマットの識別子と出自。
拡張子.csv
メディアタイプtext/csv
初版1972
仕様RFC 4180

CSV ファイルについてのよくある質問

なぜ CSV が一つの列としてしか開かれないのですか

読み込み側が想定していた区切り文字と違うためです。小数点にカンマを使う国のスプレッドシートは既定でセミコロンを使うことが多く、タブの場合もあります。ファイル自体は正常なので、取り込み画面でどの文字を区切りとして使うか指定してください。

なぜ Excel は先頭のゼロを消してしまうのですか

CSV には型がないため、Excel が列ごとに推測し、数字だけのコードを数値として扱ってしまいます。「データ」から「テキストまたは CSV から」で取り込み、読み込む前に該当の列をテキスト型に指定してください。あるいは型が宣言されている XLSX で送るという方法もあります。

値の中にカンマを含めるにはどうすればよいですか

値を二重引用符で囲みます。引用符付きの値の中に引用符自体を含める場合は二つ連ねて書きます。正しく行えばフィールドにカンマや引用符、改行まで含められますが、誤ると以降の列がすべて一つずつずれ、エラーも表示されません。

なぜアクセント記号付きの文字が文字化けするのですか

ファイルが文字エンコーディングを宣言しておらず、読み込み側が推測を誤ったためです。UTF-8 で保存してください。Windows 版 Excel にはバイトオーダーマークが効果的ですが、その代わり他のパーサーがその三バイトを最初の列見出しの一部として読んでしまうことがあります。

CSV は規格なのですか

RFC 4180 が一般的な慣習を文書化していますが、これは規格の定義ではなく既存の慣行の記録だと明言されています。多くのソフトウェアが今もこれから外れているため、CSV はほぼ互換性のある形式の集まりだと考えるのが実情に近いです。

CSV と TSV の違いは何ですか

区切り文字です。TSV はタブを使い、タブは値の中にほとんど現れないため、引用符がほとんど不要になり、値の中のカンマにまつわる問題そのものが起きなくなります。送る側と受け取る側の両方が合意できるなら、より安全な選択です。