CSV入出力メモ

CSVの正確な規格はさておき、MSエクセルで開く事を前提とする要件が多いのでまとめ。

(1) 値にダブルクォーテーションがある場合は””と2重に書くことでエスケープする。

(2) 値に改行、半角カンマ、(1)でエスケープしたダブルクォーテーションを含む場合は
値全体をダブルクォーテーションで囲む。それらを含まない値をダブルクォーテーションで囲んでも表示は変わらない。

(3) エクセルはデフォルトで数値や日付の表示を変更してしまう場合があるが、それを避けたい場合は
値全体をダブルクォーテーションで囲み、先頭に半角イコールをつける。

(4) 最終行は改行が必要。

(5) 文字コードはShift_JIS。

出力

(1) 値にダブルクォーテーションがある場合は2重ダブルクォーテーションに置換する。

(2) 値全体をダブルクォーテーションで囲む。

(3) 値を半角カンマで連結し、最後に改行をつける。

(4) 全体をShift_JISに置換する。

入力

(1) ファイルサイズが大きいことを想定し、ファイルは1行ずつ読み込む。
1行ずつ読み込むということは、ファイル文字列全体を改行で分割し、文字列を得るということ。
この文字列を「1行(row)」と呼ぶことにする。気を付けたいのは1行≠1レコード(row≠record)ということ。
値の中に改行を含む場合、1レコードが複数行になる可能性がある。

(2) 1行をカンマで分割し、文字列に分ける。この文字列を「1ピース(piece)」と呼ぶことにする。
気を付けたいのは1ピース≠1値(piece≠value)ということ。
値の中にカンマを含む場合、1値が複数ピースになる可能性がある。

(3) piece≠value ⇔ ピースに含まれるダブルクォーテーションが奇数個 を利用して、次のルーチンにいれる。
[1] ピースに含まれるダブルクォーテーションの個数を調べる。
[2] 偶数個ならばpiece=valueと判断し、奇数個ならば次のピースを現在のピースに連結しそれを新しい1つのピースとみなし、[1]に戻る。連結文字列には注意が必要で、1行内のピース間の連結には半角カンマを用いるが、行を跨いでピースを連結する場合は改行コードで連結する。

→PHPでクラスつくってみたcsv.php