2.

CSV(.csv)完全ガイド — RFC 4180・文字コード・Excel 罠・jq/pandas での扱い

編集
この記事の要点
  • CSV (Comma-Separated Values) はカンマで区切られた表形式テキストデータ。歴史は古く 1972 年の IBM Fortran まで遡る
  • 事実上の標準として RFC 4180 (2005) が存在するが、強制力はなく実装ごとに方言が多い
  • Excel が日本語環境で書き出す CSV は Shift_JIS + CRLF + BOM なし、Linux/Mac は UTF-8 + LF が主流で、文字化け事故の温床
  • フィールド内のカンマ・改行・ダブルクォートはダブルクォート (") で囲み、内部の " は "" (連続) でエスケープする
  • BOM 付き UTF-8 は Excel が UTF-8 として認識する唯一確実な方法だが、他ツールが BOM を文字として扱う場合がある
  • Python は pandas.read_csv、シェルなら csvkit / xsv / miller (mlr) / jq (json 変換後) が王道
  • Excel の自動型変換 (先頭 0 落ち・指数表記・日付化) は古典的な落とし穴。文字列扱いには TEXT 関数や Power Query を使う

概要

CSV (Comma-Separated Values) は、フィールドをカンマで区切り、レコードを改行で区切ったテキスト形式の表データである。1972 年に IBM のメインフレーム Fortran 言語がリスト指向入出力でカンマ区切り形式を採用したのが起源とされ、その後 MS-DOS の dBASE、Lotus 1-2-3、Microsoft Excel を経て、現在では業務システム間のデータ受け渡し・オープンデータ・データサイエンスの最も一般的な交換フォーマットとなっている。

仕様としては RFC 4180 (2005) が「事実上の標準」を文書化しているが、これは過去の慣習をまとめた情報提供 RFC であり、厳密な準拠を要求するものではない。そのため、区切り文字 (カンマ / セミコロン / タブ / パイプ)、引用符の有無、エスケープ規則、改行コード、文字エンコーディング、BOM の付与といった点で実装ごとに方言が多く、CSV は「単純なのに難しい」フォーマットの代表例として知られている。

内部構造とフォーマット規則

RFC 4180 が定める基本ルールは次の通り。

  • 各レコードは CRLF (\r\n) で区切る。最終行末の CRLF は任意。
  • フィールドはカンマ , で区切る。
  • 1 行目はヘッダ (列名) でもよい (オプション)。
  • フィールド内にカンマ・改行・ダブルクォートを含む場合は、フィールド全体をダブルクォートで囲む。
  • ダブルクォートで囲まれたフィールド内にダブルクォートを含めるには、ダブルクォートを 2 個連続させる ("")。
name,age,email,comment
Alice,30,"alice@example.com","Hi, I""m Alice"
Bob,25,bob@example.com,"multi
line comment"

上記では Alice の comment に ," が含まれるためダブルクォートで囲み、内側の """ にエスケープしている。Bob の comment にはフィールド内改行があるが、ダブルクォート内なら CRLF/LF は許容される。

主な用途

  • 業務システム連携: 銀行・証券・ECサイトの取引明細、勤怠データ、顧客マスタの定期エクスポート。
  • オープンデータ: e-Stat、政府 CKAN、気象庁の各種統計データの配布形式。
  • データサイエンス入門: pandas / scikit-learn のチュートリアルは多くが CSV から始まる。Kaggle の課題データの多くも CSV。
  • DB エクスポート/インポート: COPY (PostgreSQL) や LOAD DATA INFILE (MySQL)、BULK INSERT (SQL Server) で CSV を直接読み書き。
  • BI ツール: Tableau / Power BI / Metabase のデータソースとしての標準形式。

関連形式との比較

形式区切り型情報ネスト備考
CSVカンマなし (すべて文字列)不可方言多い
TSVタブなし不可引用符問題が少ない
JSONJSON 構文あり (string/number/bool/null)Web API の標準
YAMLインデントあり設定ファイル向け
Parquet列指向バイナリあり (厳格)大規模分析の標準
Excel (xlsx)セルありシート単位書式・数式を保持

編集・パーサ・ツール

# Python (pandas)
python -c "import pandas as pd; df=pd.read_csv('data.csv'); print(df.head())"

# csvkit (Python 製の CLI)
csvstat data.csv          # 列ごとの統計
csvgrep -c name -m Alice data.csv
csvjson data.csv          # CSV → JSON

# xsv (Rust 製の高速 CSV ツール)
xsv stats data.csv
xsv search -s name Alice data.csv

# miller (mlr) — 関数型風の集計
mlr --csv filter '$age > 25' then sort -nr age data.csv

# 文字コード変換 (Shift_JIS → UTF-8)
nkf -w --overwrite data.csv
iconv -f CP932 -t UTF-8 data.csv > data.utf8.csv

# Excel が UTF-8 として認識するように BOM を付ける
printf '\xEF\xBB\xBF' | cat - data.utf8.csv > data.utf8bom.csv

注意点・落とし穴

  • Excel の桁落ち: 001230001234567890123 (16 桁数値) を Excel が数値として解釈し、先頭 0 が消えたり指数表記 1.23E+15 に化ける。事前にセル書式を「文字列」にするか、Power Query 経由でインポートする。
  • 日付の自動変換: 3-73月7日 に、SEPT1 が遺伝子名でなく 2024/9/1 に化ける問題。遺伝学界では HGNC が遺伝子名を改名するに至った (2020 年)。
  • 文字コード地獄: 日本語 Excel が Shift_JIS で書き出す一方、Linux/Mac/Web は UTF-8 が主流。BOM 付き UTF-8 が双方を満たす唯一の現実解 (ただし Java の InputStreamReader 等は BOM を 1 文字目として読んでしまうので注意)。
  • 区切り文字の方言: 欧州 (ドイツ・フランス) では小数点に , を使うため、区切りに ; を使う「セミコロン CSV」が一般的。Excel のロケール依存で区切りが変わる。
  • 改行コード: フィールド内改行を含むケースでは、ナイーブな split('\n') パースが破綻する。必ず標準ライブラリ (Python の csv、Java の OpenCSV など) を使う。
  • SQL インジェクション / CSV インジェクション: =cmd|'/C calc'!A1 のようなセル先頭の = + - @ は Excel で開いた際に数式として評価され、外部コマンド実行に至る (CVE-2014-3524 系)。エクスポート時にこれら先頭文字を ' でエスケープする。

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. PDF(.pdf)
  2. CSV(.csv)
  3. Markdown(.md)
  4. TXT(.txt)
  5. DOCX(.docx)
  6. XLSX(.xlsx)
  7. PPTX(.pptx)
  8. TSV(.tsv)
  9. RTF(.rtf)
  10. ODT / ODS / ODP(.odt / .ods / .odp)

最近更新/作成されたページ