我正在尝试使用 PHP 解析 CSV 文件。
该文件使用逗号作为分隔符,并为包含逗号的字段使用双引号,如:
foo,"bar, baz",foo2
我面临的问题是我得到包含逗号分隔的字段。我得到:
"2
rue du ..."
而不是:2, rue du ...
。
编码:
该文件似乎不是 UTF8。它在开头有奇怪的字符(显然不是 BOM,从 ASCII 转换为 UTF8 时看起来像这样:)ÿþ
并且不显示重音符号。
- 我的代码编辑器(Atom)告诉编码是UTF-16 LE
mb_detect_encoding()
在 csv 行上使用它返回ASCII
但它无法转换:
mb_convert_encoding()
转换自ASCII
但返回亚洲字符UTF-16LE
iconv()
返回注意:iconv(): 字符集错误,不允许从UTF-16LE
/ASCII
到UTF8
转换。
解析:
我试图用这个单行(见那两条评论)解析str_getcsv()
:
$csv = array_map('str_getcsv', file($file['tmp_name']));
然后我尝试了fgetcsv()
:
$f = fopen($file['tmp_name'], 'r');
while (($l = fgetcsv($f)) !== false) {
$arr[] = $l;
}
$f = fclose($f);
在这两种方式中,我都将我的地址字段分为两部分。但是当我尝试这个代码示例时,我得到了正确解析的字段:
$str = 'foo,"bar, baz",foo2,azerty,"ban, bal",doe';
$data = str_getcsv($str);
echo '<pre>' . print_r($data, true) . '</pre>';
总结一下问题:
- 文件开头的字符是什么?
- 我怎么能确定编码?(Atom 读取文件时
UTF-16 LE
不显示奇怪的字符) - 是什么让 csv 解析功能失败?
- 如果我应该依靠其他东西来解析 CSV 的行,我可以使用什么?