PHPのfgetcsvでうまく読み込めないケース
CSVの読み込みはfgetcsvに任せていればいいだろうと思っていたらうまく読み込めないケースがあった。
いくつかのケースを試してみて「ダブルクォーテーションで括られた文字列の中で、バックスラッシュの後にマルチバイト文字が続く文字列が存在する場合」におかしくなるっぽいことがわかった。
1,"\あ",おはよう 2,こんにちは,さようなら
このCSVを fgetcsv で読み込んで 1 行ずつ print_r で出力すると、次のようになる。
Array ( [0] => 1 [1] => \あ",おはよう 2,こんにちは,さようなら )
2カラム目に2行目の値まで入ってしまった。
ちなみにダブルクォーテーションで括られてなければ、バックスラッシュの後にマルチバイト文字があっても問題ない。
1,\あ,おはよう 2,こんにちは,さようなら
Array ( [0] => 1 [1] => \あ [2] => おはよう ) Array ( [0] => 2 [1] => こんにちは [2] => さようなら )
ふむ。
エスケープシーケンスを指定しなければいいのかな?と思って fgetcsv の 5 番目の引数を空文字にしてみたら、
$row = fgetcsv($fp, 0, ',', '"', '');
% php test.php PHP Warning: fgetcsv(): escape must be character in ...
文字じゃないとだめらしい。
なので回避策としては、不要ならばダブルクォーテーションをつけないか、もしくはCSV内のバックスラッシュを2個にして出力時に1個に変換するとか、そういうとこだろうか。
コメントを残す