PHPのfputcsv関数は便利です。
しかし、以下のような点が不便です。
エンコーディングを変換できない
主にCSV出力先になるExcelでは、Shift-JIS以外のCSVを開けません。
Excel 2007ならBOMを付けるとか、データインポートで実行するといった回避策はありますが、日本語のみならShift-JISで出力したいことが多いと思います。
このためにはあらかじめShift-JISに変換しておく必要があり、
$sjis = array_map(create_function(‘$str’, ‘return mb_convert_encoding($str, “Shift-JIS”, “UTF-8”);’), $line);
といった処理をやっていましたが、正直めんどうです。
ダブルコーテーションのエスケープにバグがある
カンマが含まれる場合、ダブルコーテーションで囲ってくれます。
ダブルコーテーションが含まれる場合、ダブルコーテーションを二重にしてエスケープしてくれます。
しかし、\"
(バックスラッシュ+ダブルコーテーション)があった場合、なぜかこの部分のダブルコーテーションは二重にしてくれません。
解決方法
ということで、結局自前でやった方が便利です。
mb_str_replaceは、http://fetus.k-hsu.net/document/programming/php/mb_str_replace.htmlを使わせて頂きました。
function _fputcsv($fp, $data, $toEncoding='Shift-JIS', $srcEncoding='UTF-8') {
require_once 'mb_str_replace.php';
$csv = '';
foreach ($data as $col) {
if (is_numeric($col)) {
$csv .= $col;
} else {
$col = mb_convert_encoding($col, $toEncoding, $srcEncoding);
$col = mb_str_replace('"', '""', $col, $toEncoding);
$csv .= '"' . $col . '"';
}
$csv .= ',';
}
fwrite($fp, $csv);
fwrite($fp, "\r\n");
}
ちゃんとテストしていないのでミスがあるかもしれませんが、このくらいシンプルで十分そうですね。