CSV

Comma-Separated Values の略で、カンマ区切りでデータを表現するテキスト形式。表形式データの交換に広く使われる。

CSV (Comma-Separated Values) は、各フィールドをカンマで区切り、各レコードを改行で区切るシンプルなテキスト形式です。表計算ソフトやデータベースとのデータ交換に広く使われており、そのシンプルさゆえに数十年にわたって標準的なデータ交換フォーマットの地位を維持しています。

CSV の書式をまとめた文書として RFC 4180 (2005 年 10 月) がありますが、これは Informational として公開されたもので、本文に「いかなる種類のインターネット標準も規定しない」と明記されています。つまり CSV には強制力のある単一の仕様がなく、実際にはソフトウェアごとの方言が残ります。RFC 4180 が整理している内容は、レコードの区切りが CRLF であること、フィールド内にカンマ・改行・ダブルクォートを含む場合はフィールド全体をダブルクォートで囲み、内側のダブルクォートは二重化すること、そして text/csv というメディア型と、その任意パラメータ charset および header (値は present / absent) です。後に RFC 7111 が、URL のフラグメントで特定の行や列を指す記法を追加する形でこれを更新しています。ヘッダー行があるかどうかは書式自体からは判別できず、受け渡しの約束事に委ねられている点が実務では地味に厄介です。

区切り文字がカンマではなくタブの場合は TSV (Tab-Separated Values) と呼ばれ、セミコロン区切りの CSV もヨーロッパ圏では一般的です。これは小数点にカンマを使うロケールがあり、表計算ソフトが区切り文字をロケール設定から決めるためで、同じファイルが環境によって 1 列に見えたり正しく分かれたりします。相手の環境が不明なまま配布するファイルでは、区切り文字とエンコーディングを明示するのが安全です。

日本語環境では文字コードの問題が頻発します。Excel で CSV を開く際、UTF-8 の BOM なしファイルは文字化けすることがあり、Shift_JIS や BOM 付き UTF-8 での出力が求められる場面があります。BOM (Byte Order Mark) は U+FEFF を UTF-8 で符号化した 3 バイト (EF BB BF) で、ファイル先頭に付加することで Excel が UTF-8 として正しく認識します。Python の csv モジュールや JavaScript の各種ライブラリでは、エンコーディングと BOM の制御が可能です (Python なら書き出し時に encoding="utf-8-sig" を指定します)。

文字化け以外にも、表計算ソフトで開いた時点で値が書き換わる落とし穴があります。先頭が 0 の数字列 (郵便番号や商品コード) は 0 が落ち、1-22026/8 のような値は日付として解釈され、桁数の多い数値は指数表記になります。CSV 自体は型を持たないテキストなので、こうした変換は開いた側の推測によって起きます。開いて上書き保存すると変換後の値がそのまま残るため、受け渡しの経路に表計算ソフトを挟む場合は、インポート時に列の型を「文字列」に指定するか、そもそも開かない運用にするのが確実です。もう一点、=+-@ で始まるフィールドは数式として実行される場合があり、外部入力をそのまま CSV に出力する機能ではセキュリティ上の注意が必要です。

CSV と JSON の使い分けは実務でよく議論されるテーマです。CSV は表形式データに適しており、ファイルサイズが小さく、Excel で直接開ける利点があります。一方、JSON はネスト構造や型情報を表現でき、API のレスポンス形式として主流です。大量の表形式データを扱う場合は CSV、構造化されたデータ交換には JSON という使い分けが一般的です。

CSV のパース処理では、エッジケースへの対応が重要です。フィールド内の改行、エスケープされたダブルクォート、空フィールドと null の区別、末尾のカンマの扱いなど、単純な split(',') では正しく処理できないケースが多数あります。たとえば "a,b",c という 2 フィールドの行を split(',') にかけると '"a' / 'b"' / 'c' の 3 要素に割れますが、規格どおりに解釈すれば a,bc の 2 フィールドです。1 行ずれるのではなく列がずれるため、件数チェックだけでは異常に気づけません。信頼性の高い CSV パーサーライブラリ (Python の csv モジュール、JavaScript の Papa Parse など) を使用することが推奨されます。行単位の分割も同様で、フィールド内の改行を考慮せずに改行で区切ると 1 レコードが複数行に割れます。

文字数カウントの観点では、CSV のカンマや引用符などの区切り文字がデータサイズに影響します。フィールド数が多いほどカンマの数が増え、引用符で囲む必要があるフィールドが多いほどオーバーヘッドが大きくなります。大量データの場合、JSON と比較して CSV のほうがオーバーヘッドが少ない傾向がありますが、フィールド内にカンマや改行が多い場合はその限りではありません。

この記事を共有