Tech Racho エンジニアの「?」を「!」に。
  • 開発

[PHP] fputcsv関数の問題点と解決方法

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

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


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。