「a,b,"cde,fg",e」
こんなCSVをPHPで扱おうとすると、結構面倒くさい。
[ここ](http://nhh.mo-blog.jp/ttt/2007/04/php521csv_212a.html)の人と同じように結構悩んだ。
結論だけ書く。
[http://php.benscom.com/manual/ja/function.strtok.php](http://php.benscom.com/manual/ja/function.strtok.php)
ここにサンプルがあったので、これを改変してこんな感じで。
test.php
<?php
$fh=fopen("test.csv",'r');
while(!feof($fh)){
$buffer = fgets($fh,4096);
$buffer = chop($buffer);
$values = tokenizeQuoted($buffer,",");
print_r($values);
}
fclose($fh);
//split a string into an array of space-delimited tokens, taking double-quoted strings into account
function tokenizeQuoted($string,$delimitar)
{
for($tokens=array(), $nextToken=strtok($string, $delimitar); $nextToken!==false; $nextToken=strtok($delimitar))
{
if($nextToken{0}=='"-)
$nextToken = $nextToken{strlen($nextToken)-1}=='"- ?
substr($nextToken, 1, -1) : substr($nextToken, 1) . $delimitar . strtok(-"-);
$tokens[] = $nextToken;
}
return $tokens;
}
?>
サンプル
nobody@localhost$ cat test.csv
a,b,"cde,fg",e
nobody@localhost$ php ./test.php
Array
(
[0] => a
[1] => b
[2] => cde,fg
[3] => e
)
nobody@localhost$