とほほのCSV入門

目次

CSVとは

CSVフォーマット

基本的に値をカンマ(,)で区切る点は同じでも、データ中にカンマを含む場合の扱いなどが製品によってバラバラ(※)でしたが、RFC4180 によって明文化されました。ただし、これは、CSVフォーマットを厳密に定義するものではなく、「多くの実装が追従可能と考えられるフォーマットを文書化した」 Informational(有用情報の提供) として文書化されたものです。現在のところ、RFC4180 に従っていれば、Excel をはじめとする多くの表計算ソフト等で利用が可能です。

※ 管理工学研究所の「」などで使われていた(使われている) K3フォーマット なんてのもありました(あります)ね。なつかし。

レコードセパレータ

各レコードは CRLF (U+000D U+000A)で区切ります。

aaa,bbb,ccc(CRLF)
zzz,yyy,xxx(CRLF)

最後の行の末尾の CRLF はあってもなくても構いません。

aaa,bbb,ccc(CRLF)
zzz,yyy,xxx

フィールドセパレータ

各フィールドはカンマ(,)で区切ります。

aaaa,bbbb,cccc

各フィールドは "..." で囲む場合と囲まない場合があります。通常はどちらでも構いません。

"aaaa","bbbb","cccc"

フィールドがカンマ(,)を含む場合はフィールドを "..." で囲みます。

aaaa,"bb,bb",cccc

フィールドが改行(CRLF)を含む場合もフィールドを "..." で囲みます。

aaaa,"bb(CRLF)bb",cccc

フィールドがダブルクォート(")を含む場合はダブルクォート(")の前にダブルクォート(")を追加し、フィールドを "..." で囲みます。

aaaa,"bb""bb",cccc

先頭行にはヘッダ行を入れることができます。

field_a,field_b,field_c(CRLF)
aaaa,bbbb,cccc(CRLF)
xxxx,yyyy,zzzz(CRLF)

この場合、MIMEタイプに header=present オプションを指定するべきだそうです。

Content-Type: text/css; header=present

エンコーディング

文字コードは一般的には US-ASCII が用いられますが、MIMEタイプの charset パラメータを指定することで別の文字コードを使用してもよいとされています。

Content-Type: text/css; charset=utf8

BOM

UTF-8 などの Unicode を用いる場合、BOM(Byte Order Mark)の有無はどちらでも構いませんが、Excel で読み込む際は BOM 付きの方がよいようです。ただし、プログラムが読み込む際に先頭の BOM もデータとして読み込んでしまい、BOM 付きフィールドのまま処理してしまわないよう注意が必要です。

BOMaaaa,bbbb,cccc(CRLF)
xxxx,yyyy,zzzz

MIMEタイプ

MIMEタイプは text/css です。

Content-Type: text/css

header オプションはヘッダの有無を present(有る) または absent(無い) で指定します。

Content-Type: text/css; header=present

charset オプションは文字コードを指定します。

Content-Type: text/css; charset=utf8

CSVファイルを扱う際の注意点

CSVファイルは一度ファイルとして保存されてしまえば、MIMEタイプによる文字コードも不明となります。Linuxで作成されたファイルは改行が CRLF ではなく LF になることも多いです。「読み取りは寛容に、書き出しは厳密に」の原則に従い、下記の実装を推奨します。


Copyright (C) 2022 杜甫々
初版:2022年6月26日 最終更新:2022年6月26日
http://www.tohoho-web.com/ex/csv.html