※ パクレゼルヴではWeb開発エンジニアを大募集中!詳細はこちら
Home > PHP > csvファイルの一般的な書式

csvファイルの一般的な書式  

2008/9/25 木曜日 18:56:59

久しぶりのチョコボールです。

最近CSV出力でちょっとハマりました。

プログラムでCSVファイルを生成する際、基本的に全てのフィールドに対してダブルクォーテーションで囲むようにしています。
必要とするCSVファイルによっては「ダブルクォーテーション無しで」という制約もありますので、そういった場合を除いての話です。

フィールド内にダブルクォーテーションやカンマが入っていなければ、フィールドデータをダブルクォーテーションで囲む必要は無いのですが、
入っていた場合、Excel等では正常に読み込めなくなります。
カンマを含むデータがフィールドに入っていた場合、「一つのフィールドの区切り」として認識しちゃいますから!

フィールドをダブルクォーテーションで囲んだ場合、フィールド内のダブルクォーテーションをエスケープする必要があります。

phpの世界ではエスケープといえば「\」マークをつけることが何かと多いです。
とあるシステムのCSV関連のクラスではフィールド内の「”」を「\”」と置換して出力しており、何の疑いも持たなかったんですが、
出力したCSVをExcelで読み込んでみたところ、ダブルクォーテーションを含むフィールドあたりでズレが生じてしまいました。

調べた結果、CSVファイルの一般的書式としてRFCが存在しました。

RFC4180

2005年の秋に制定されたようです。割と最近ですね。

要点をまとめると、

  • 改行コードは(CR+LF)。
  • 改行コード(CR+LF)、ダブルクォーテーション、カンマを含むフィールドは
    ダブルクォーテーションで囲むべきである。
  • フィールド内にダブルクォーテーションを含む場合は、
    その直前にひとつダブルクォーテーションを付加してエスケープしなければならない。
  • ファイル内最終レコードの末尾には改行コードがあってもなくてもよい。

フィールド内の「”」は「”"」のように置換してあげる必要があったのですね。

csvをRFC4180準拠で生成してやるとExcelでは読み込めると思います。

しかし、Excelでフィールド内でAlt + Enterで改行を入れてcsvとして保存するとその部分の改行コードはLFになります。。

取り敢えずRFC4180でのcsv形式が広く普及するといいな~と思います。

MoriMoriMoriMori PHP