- CSVを置き換える「より優れた」形式がしばしば紹介されるが、その多くは偏った比較に基づいており、CSVの本当の強みを見落としている
- この記事はCSVが完璧だと主張するものではなく、過小評価されている利点に光を当てることを目的としている
- CSVを嫌うのが格好いいかのような空気に逆らい、CSVの真価を改めて見つめ直す
1. CSVは極めてシンプル
- CSVの定義は題名のとおり、「カンマ区切りの値」
- 行は改行で、列はカンマで区切られる
- 値にカンマや改行が含まれる場合は引用符で囲み、引用符そのものは二重引用符で表す
- 複雑な仕様がなく、誰でも直感的に理解して使える
- ただし、正確にパースするためには専用のCSVパーサーを使う必要がある
2. CSVは集合知のアイデア
- 所有者がおらず、私有化もされていない
- RFC 4180は存在するが、ほとんどの人は参考程度にしか見ていない
- 世界中の開発者が暗黙に共有する共通ルールに基づく自由な形式
3. CSVはテキスト
- JSON、YAML、XMLのように人が読めるプレーンテキスト形式
- どんなテキストエディタでも開けて、専用ツールなしでも内容を確認できる
- エンコーディング方式も自由に選べる
4. CSVはストリーミングに最適化されている
- 1行ずつ読む構造なので、メモリ消費が非常に少ない
- シンプルなコードだけで、数GBのデータを数KBのメモリで処理できる
- Parquetのような列指向フォーマットはストリーミング処理が難しく、複雑なバッファリングが必要になる
- 欠点は、特定の列だけ見たい場合でも行全体を読まなければならないこと
5. CSVは簡単に追記できる
- ファイルをappendモード(
a+)で開いて新しい行を末尾に追加するのがとても簡単
- 一方でParquetなどの列指向フォーマットは、行の追加が非効率で複雑
6. CSVは動的型付けを許容する
- 固定型がないため、柔軟にデータを解釈できる
- 例: JavaScriptは64ビット整数を正確に表現できないが、CSVならこうした制約なしに使える
- 言語間の互換性と柔軟性の面で利点がある
- ただし、誤って解釈するとエラーが起こりうるため、利用時には注意が必要
- 高性能が求められる場合は、テキストをデコードせずにバイナリレベルで直接処理することも可能
7. CSVは簡潔
- ヘッダーはファイルの先頭にしか存在しないため、形式の繰り返しがほとんどない
- JSONやXMLはキーの繰り返しによるオーバーヘッドが大きい
- 文字列表現自体もすでに簡潔で、フォーマット固有のオーバーヘッド(カンマ、引用符など)も非常に少ない
8. 反転したCSVも依然として有効
- CSVはバイト単位で反転しても、なお有効なCSVである
- これは二重引用符によるエスケープ方式のおかげで、回文のようなエスケープ方式になっているため
- この特性により、CSVファイルの末尾部分を非常に効率よく読める
- 例: 中断したプロセスを再開するとき、ファイルの最後の数行だけを読んで再スタートできる
9. ExcelはCSVを嫌う
- Excelが扱いづらいと感じる形式なら、むしろ正しい道を進んでいるサインかもしれない
3件のコメント
シンプル・イズ・ベスト!
もっと悪いほど、より良い!
Hacker Newsの意見
CSVやINIファイルが好きな理由は、シンプルでテキストベースであり、形式に型がエンコードされておらず、文字列だけで構成されているから
CSVはエレガントだが致命的な欠点がある - 引用符が「非局所的」な効果を持つ
CSVの最高の点は、誰でも30分でパーサーを書けること
CSVが好きな人は、企業環境でCSVインジェクション対策を求められたことがないのだろう
CSVが好きな理由はいろいろある
最近、Raspberry Piベースのソリューションを開発している
CSVのつまらない点は、急いで書かれたパーサーやシリアライザーが引用符の扱いで同じありきたりなミスを繰り返すこと
もしこれが本当にラブレターなら、CSV形式で書かれていただろう
JSONへの反論はそれほど説得力がない
現代的な形式が好きな者として、迷ったときはCSVやJSONLを使う
grepで簡単に検索でき、ストリーミングも可能