csvファイルの一般的な書式 
久しぶりのチョコボールです。
最近CSV出力でちょっとハマりました。
プログラムでCSVファイルを生成する際、基本的に全てのフィールドに対してダブルクォーテーションで囲むようにしています。
必要とするCSVファイルによっては「ダブルクォーテーション無しで」という制約もありますので、そういった場合を除いての話です。
フィールド内にダブルクォーテーションやカンマが入っていなければ、フィールドデータをダブルクォーテーションで囲む必要は無いのですが、
入っていた場合、Excel等では正常に読み込めなくなります。
カンマを含むデータがフィールドに入っていた場合、「一つのフィールドの区切り」として認識しちゃいますから!
フィールドをダブルクォーテーションで囲んだ場合、フィールド内のダブルクォーテーションをエスケープする必要があります。
phpの世界ではエスケープといえば「\」マークをつけることが何かと多いです。
とあるシステムのCSV関連のクラスではフィールド内の「”」を「\”」と置換して出力しており、何の疑いも持たなかったんですが、
出力したCSVをExcelで読み込んでみたところ、ダブルクォーテーションを含むフィールドあたりでズレが生じてしまいました。
調べた結果、CSVファイルの一般的書式としてRFCが存在しました。
2005年の秋に制定されたようです。割と最近ですね。
要点をまとめると、
- 改行コードは(CR+LF)。
- 改行コード(CR+LF)、ダブルクォーテーション、カンマを含むフィールドは
ダブルクォーテーションで囲むべきである。 - フィールド内にダブルクォーテーションを含む場合は、
その直前にひとつダブルクォーテーションを付加してエスケープしなければならない。 - ファイル内最終レコードの末尾には改行コードがあってもなくてもよい。
フィールド内の「”」は「”"」のように置換してあげる必要があったのですね。
csvをRFC4180準拠で生成してやるとExcelでは読み込めると思います。
しかし、Excelでフィールド内でAlt + Enterで改行を入れてcsvとして保存するとその部分の改行コードはLFになります。。
取り敢えずRFC4180でのcsv形式が広く普及するといいな~と思います。