F.Ko-Jiの「一秒後は未来」

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個に変換するとか、そういうとこだろうか。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など