我必须用 PHP 解析一个 CSV 文件。CSV 文件由客户提供,我无法控制格式。它以逗号分隔并使用双引号作为文本限定符。但是,如果某个字段(例如地址字段)中包含逗号,则客户端的系统会将该字段括在一组额外的双引号中。例如:
"9999X111","X1110000110105","John Doe",""123 Central Park Avenue, #108"","New York NY 10006 ","","","M","0","1","370.20"
如您所见,第 4 个字段(第 3 个索引)在整个字段周围有一组额外的双引号。如果我通过 fgetcsv() 或 str_getcsv() 发送此字符串,则该字段未正确处理。
Unwanted Result Array:
[0] => 9999X111
[1] => X1110000110105
[2] => John Doe
[3] => 555 Central Park Avenue
[4] => #108""
[5] => New York NY 10006
如果我手动删除额外的双引号集,则使用任一函数都可以正确处理该行;但是,我无法在生产环境中执行此操作。
Preferred Result Array:
[0] => 9999X111
[1] => X1110000110105
[2] => John Doe
[3] => 555 Central Park Avenue, #108
[4] => New York NY 10006
这是我正在使用的当前代码:
$fileCHG = fopen($fileloc['InputFile'], "r");
$cnt = 0;
while(!feof($fileCHG)) {
$chg[$cnt] = fgetcsv($fileCHG,0,",","\"");
if($chg[$cnt]=="") { //Unset Any Blank Arrays
unset($chg[$cnt]);
}
$cnt++;
}
我已经尝试了来自 Stack Overflow、PHP 手册等的各种建议,但似乎无法使其正常工作。即使我用反斜杠手动转义内部双引号集,我仍然得到不正确的结果数组。无论我如何使用任何一个函数,我的脚本都会搞砸并尝试在“Avenue”后面的逗号处拆分字段并忽略剩余的“”。
我觉得 PHP 网站上的这条评论可能正在解释正在发生的事情,但作为一个新编码员,我无法想象实际发生了什么。
http://www.php.net/manual/en/function.fgetcsv.php#58124
我也尝试了以下建议(很多)无济于事。
fgetcsv 未正确拆分数据 str_getcsv 未正确解析数据
这种方法本来可以的;但它要求每行的字段数相同。
我在 Mac OS X 10.8 上使用 PHP 5.3.27。
提前感谢您查看。