基本的に値をカンマ(,)で区切る点は同じでも、データ中にカンマを含む場合の扱いなどが製品によってバラバラ(※)でしたが、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
UTF-8 などの Unicode を用いる場合、BOM(Byte Order Mark)の有無はどちらでも構いませんが、Excel で読み込む際は BOM 付きの方がよいようです。ただし、プログラムが読み込む際に先頭の BOM もデータとして読み込んでしまい、BOM 付きフィールドのまま処理してしまわないよう注意が必要です。
BOMaaaa,bbbb,cccc(CRLF) xxxx,yyyy,zzzz
MIMEタイプは text/css です。
Content-Type: text/css
header オプションはヘッダの有無を present(有る) または absent(無い) で指定します。
Content-Type: text/css; header=present
charset オプションは文字コードを指定します。
Content-Type: text/css; charset=utf8
CSVファイルは一度ファイルとして保存されてしまえば、MIMEタイプによる文字コードも不明となります。Linuxで作成されたファイルは改行が CRLF ではなく LF になることも多いです。「読み取りは寛容に、書き出しは厳密に」の原則に従い、下記の実装を推奨します。