Techracho

fputcsvの問題点と改良

このエントリーをはてなブックマーク Share
2010.03.01    PHP, 馬場      baba   

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");
}

ちゃんとテストしていないのでミスがあるかもしれませんが、このくらいシンプルで十分そうですね。

COPYRIGHT [C] 2009 BEYOND PERSPECTIVE SOLUTIONS LTD. ALL RIGHTS RESERVED.