ネットサービスの開発に役立ちそうな話題を中心にお届けします。
F.Ko-Jiの「一秒後は未来」 > PHP
2012年03月16日 17:06

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

2012年02月26日 21:48

PHPで「URLからutm_sourceなどutm_で始まるパラメータを削除する関数」を書く

2011年12月25日 19:00

メモリリークの原因はPHP5.2だった

2011年03月11日 12:00

PHPのarray_uniqueで歯抜けになった配列のインデックスを詰める方法

2011年03月10日 23:09

PEARのHTTP_OAuthでタイムアウトを指定する

2011年02月08日 16:35

MagpieRSSのキャッシュとConditional GETについて

2011年01月29日 17:23

Googleの短縮URL「goo.gl」のAPIをPHPのcURLで使うサンプル

2011年01月04日 14:46

TSV形式でダウンロードしたAmazonアソシエイトのレポートをPHPで集計する

2010年12月31日 03:27

特定ファイルのみPHPを無効にする方法

2010年12月28日 16:52

Google AnalyticsのData Export APIを扱うPHPライブラリ「GAPI」を試す

2010年12月24日 14:28

単純なミスでMySQLのプロセスが溜まってしまった話

2010年11月05日 14:43

さくらのVPSにPECL::memcachedをインストール

2010年09月16日 01:53

Mac OS X(Snow Leopard)のMacPortsでApache2, PHP5, MySQL5をインストールし直した

2010年08月14日 14:02

Twitterの公式ツイートボタンをWordPressのトップページに設置する方法

2010年07月01日 05:38

ADOdbのセッション管理でスロークエリ

2010年05月20日 16:57

Amazon Simple Notification Service(Amazon SNS)をPHPから使ってみる

2010年02月02日 23:54

TwitterでOAuth認証した後どうするか

2009年10月08日 23:45

Google Maps APIのジオコーディングをサーバーサイドでおこなう方法

2009年10月03日 14:23

海外からアクセスできなくなったフィードを他のサーバー経由でFeedBurnerに読み込ませる方法

2009年08月09日 12:52

MacにPHPのPECL OAuthライブラリをインストール