はじめに
CSVファイルは最も普及したデータ交換用フォーマットですが、さまざまな方言があります。
本稿ではCSVファイルフォーマットの仕様とデータ交換時のポイントを説明します。
対象読者
CSVファイルを扱うDB管理者、開発者。
CSVとは?
CSVとはComma-Separated Valuesの略で、カンマ区切りで並べた値という意味です。
CSVファイルの例として、一般的なアドレス帳データを示します。
"姓","名","生年月日","郵便番号","住所","電話番号" "山田","太郎","2001/1/1","100-0002","東京都千代田区皇居外苑","03-1234-5678" "山田","次郎","2001/1/2","251-0036","神奈川県藤沢市江の島1丁目","03-9999-9999"
カンマで区切られたデータの横一列を"行"(英:Row)、縦一列を"列"(英:Column)と呼びます。先頭行は各列のタイトルです。
ファイルフォーマット仕様
ファイル形式
ファイルはテキスト形式です。
文字コード
規定はありませんが、日本では主にShift_JIS、他にEUC、Unicodeなどを使います。
ヘッダ行の有無
最初の1行がデータではなく、各カラムのタイトルになっている場合があります。これをヘッダと呼びます。
"姓","名","生年月日","郵便番号","住所","電話番号"
使う側が各カラムの意味を認識しているのであれば、あってもなくてもかまいませんが、他システムとのデータ交換時には、ヘッダを付けるか付けないかの取り決めが必要です。
区切り文字の種類
CSVは「,」(カンマ)区切りが基本ですが、<TAB>(タブ)で区切る場合もあります。これを特にTSV(Tab-Separated Values)と呼びます。TSVはよく利用されますが、データ内に<TAB>を含まないことが前提です。もし含む場合は、削除もしくは置換を行います。
山田 <TAB> 太郎 <TAB> 2001/1/1 <TAB> 100-0002 <TAB> 東京都千代田区皇居外苑
本稿ではカンマ区切りのみを扱います。
※2008/06/07追記:カンマ区切りCSVのCは「Comma」ですが、タブ区切りのTSVなどもまとめて「CSV」=「Character-Separated Values」と呼ぶそうです。
改行コード
改行コードはプラットフォームによって異なります。一般的にWindowsは<CR><LF>、UNIXは<LF>です。
※2008/04/16追記:RFCでは末尾(レコードの区切りとして)の改行は<CR><LF>を推奨しています。CSVを解釈するプログラムではどちらの改行コードでも読めるように作ることをお勧めします。
※2008/06/07追記:本稿のコメントでRFC4180と改行コードに関するご指摘があります。ただし、CSVがRFC4180よりも以前に考えられた形式でありRFCを正としているわけではないこと(CSVの実装には、各社独自の拡張や制約がある。ただし、歴史的に見れば、これらの実装のほうがRFC 4180以前から存在している。- Wikipediaより引用)、CSVはテキストエディタで編集できること自体がこのフォーマットの利点であり自然と改行コードはプラットフォームに合わせること、などから上記の記述になっています。
ダブルクォート
CSVでは値をダブルクォートで囲みます。
"山田"
しかし、ダブルクォートを使わない場合もあります。これは値の中に「ダブルクォート(")」「カンマ(,)」「改行(<CR>、<LF>)」などの制御文字を含まない、という前提条件があります。
山田,太郎,値の改行、カンマやダブルクォートは削除します。
もしこれらが値に含まれる場合は、以下のルールを守ります。
- 値をダブルクォートで囲むこと。
- 値内のダブルクォートは二重化("→"")すること。
"山田","太郎","値に 改行や,カンマや""ダブルクォートが含まれても問題ありません。"
値に改行が含まれているCSVをテキストエディタで見ると不正な形式に見えますが、ダブルクォートで囲まれていれば、問題ありません。
まれにCSVの方言で\エスケープを行うことがあります。
"山田","太郎","値に改行\nや\,カンマや\"ダブルクォートが含まれても問題ありません。"
この方言はあまり普及していませんので、利用するのは避けましょう。
データ交換時のポイント
どれが標準か?
紹介したようにCSV形式にはいくつものパターンがあります。その中でも標準と呼べるのは以下のパターンです。
- 区切り文字はカンマ
- ダブルクォートで囲み、値内のダブルクォートは二重化
- ヘッダ行は付けない(ただし、データをExcelで利用する場合は付ける)
自分がデータを「渡す側」ならばこのパターンを守り、「受け取る側」ならば個別に取り決めをする必要があります。
データ交換に必要な取り決め
CSV形式でデータ交換を行う場合は、必ず以下の項目の取り決めを行ってください。
- 文字コード
- 改行コード
- ヘッダ行の有無
- 区切り文字
- ダブルクォートで囲むか否か
- ダブルクォートで囲まない場合の値内の制御文字(ダブルクォート、カンマ、タブ、改行)の処理
データ交換時に「文字コードが違う」「改行が含まれている」「データにヘッダが入ってしまった」という失敗をよく聞きます。ご注意を。
まとめ
CSV形式の詳細と扱い方について説明しました。CSVはとても広く使われているのに、方言が多く、説明資料も少なく、初心者の失敗談に事欠きません。本稿が皆さまのお役に立てれば幸いです。
参考資料
- RFC4180
カテゴリが「Informational」、情報提供目的ですが、CSVの公式仕様と考えてよいです(CSVは公式仕様として標準化されていません。また、される予定もありません)。
- RFC4180(日本語訳)
RFCの日本語訳です。
- How To:The Comma Separated Value (CSV) File Format
CSVの仕様、解析、XMLへの変換について説明しています。