fgetcsv 不读取附件
fgetcsv not reading enclosures
我正在尝试使用 fgetcsv
读取 CSV 行。但是它似乎根本不关心外壳。
这是该行的样子:
Super Administrator,"ROLE_SUPER_ADMIN, ROLE_GROUP_GUEST, ROLE_GROUP_WRITER, ROLE_USER_WRITER, ROLE_USER_GUEST"
根据 CSV 标准,这是一个有效的行,它应该 return 以下以 "
作为附件,,
作为分隔符:
$l = fgetcsv($handle, 0, ',', '"');
array(
[0] => 'Super Administrator',
[1] => 'ROLE_SUPER_ADMIN, ROLE_GROUP_GUEST, ROLE_GROUP_WRITER, ROLE_USER_WRITER, ROLE_USER_GUEST',
);
然而这是我得到的:
$l = fgetcsv($handle, 0, ',', '"');
array(
[0] => 'Super Administrator',
[1] => '"ROLE_SUPER_ADMIN',
[2] => ' ROLE_GROUP_GUEST',
[3] => ' ROLE_GROUP_WRITER',
[4] => ' ROLE_USER_WRITER',
[5] => ' ROLE_USER_GUEST"',
);
是的,似乎 fgetcsv
完全忽略了封闭字符。我尝试使用 fgets
然后使用 str_getcsv
使其工作,但结果是相同的 - str_getcsv
最有可能被 fgetcsv
调用以进行 CSV 转换。
我想这可能是我正在使用的 PHP 版本中出现的某种回归错误,所以我将 php -v
命令的结果粘贴在这里:
me@linux:~/$ php -v
PHP 5.5.27-1+deb.sury.org~trusty+1 (cli) (built: Jul 15 2015 12:14:44)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
我相信这是我写这篇文章时 PHP5 的最新版本。虽然我怀疑这是某种 PHP 错误,但它也可能是某种 installation/configuration 问题,因此我发布这个问题的原因。
有人经历过吗?
解决此问题的最佳方法是什么?
编辑:
正如 Mark Baker 所指出的,PHP5.5.27-1 实际上是目前 PHP5.5 的最新版本。
编辑 2:
这是 bin2hex
函数的尝试,显示为 var_dump
.
行读取 ",",","
(2 个单元格,每个单元格仅包含一个逗号):0022002c0022002c0022002c0022000a
.
使用 bin2hex('"')
结果只是 22
.
str_getcsv
仍然给我这个错误。
好的,解决了。
这就是大家的疑惑:文件的编码被搞乱了。我不知道这是哪种编码,但每当我尝试打开 CSV 时,LibreOffice 都会向我推荐 Unicode。
我不得不用 nano 打开它们才意识到确实存在编码问题。 Gedit、vim 或我电脑上的任何其他工具都没有出现错误。使用 nano 打开时,在每隔一个字符之间插入一个 @
符号,并且换行符读取不正确。
似乎 fgetcsv
不支持某些编码。为了解决这个问题,我从 nano 重新创建了文件(从另一个没有显示 @
的工具复制粘贴)。
我正在尝试使用 fgetcsv
读取 CSV 行。但是它似乎根本不关心外壳。
这是该行的样子:
Super Administrator,"ROLE_SUPER_ADMIN, ROLE_GROUP_GUEST, ROLE_GROUP_WRITER, ROLE_USER_WRITER, ROLE_USER_GUEST"
根据 CSV 标准,这是一个有效的行,它应该 return 以下以 "
作为附件,,
作为分隔符:
$l = fgetcsv($handle, 0, ',', '"');
array(
[0] => 'Super Administrator',
[1] => 'ROLE_SUPER_ADMIN, ROLE_GROUP_GUEST, ROLE_GROUP_WRITER, ROLE_USER_WRITER, ROLE_USER_GUEST',
);
然而这是我得到的:
$l = fgetcsv($handle, 0, ',', '"');
array(
[0] => 'Super Administrator',
[1] => '"ROLE_SUPER_ADMIN',
[2] => ' ROLE_GROUP_GUEST',
[3] => ' ROLE_GROUP_WRITER',
[4] => ' ROLE_USER_WRITER',
[5] => ' ROLE_USER_GUEST"',
);
是的,似乎 fgetcsv
完全忽略了封闭字符。我尝试使用 fgets
然后使用 str_getcsv
使其工作,但结果是相同的 - str_getcsv
最有可能被 fgetcsv
调用以进行 CSV 转换。
我想这可能是我正在使用的 PHP 版本中出现的某种回归错误,所以我将 php -v
命令的结果粘贴在这里:
me@linux:~/$ php -v
PHP 5.5.27-1+deb.sury.org~trusty+1 (cli) (built: Jul 15 2015 12:14:44)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
我相信这是我写这篇文章时 PHP5 的最新版本。虽然我怀疑这是某种 PHP 错误,但它也可能是某种 installation/configuration 问题,因此我发布这个问题的原因。
有人经历过吗? 解决此问题的最佳方法是什么?
编辑:
正如 Mark Baker 所指出的,PHP5.5.27-1 实际上是目前 PHP5.5 的最新版本。
编辑 2:
这是 bin2hex
函数的尝试,显示为 var_dump
.
行读取 ",",","
(2 个单元格,每个单元格仅包含一个逗号):0022002c0022002c0022002c0022000a
.
使用 bin2hex('"')
结果只是 22
.
str_getcsv
仍然给我这个错误。
好的,解决了。
这就是大家的疑惑:文件的编码被搞乱了。我不知道这是哪种编码,但每当我尝试打开 CSV 时,LibreOffice 都会向我推荐 Unicode。
我不得不用 nano 打开它们才意识到确实存在编码问题。 Gedit、vim 或我电脑上的任何其他工具都没有出现错误。使用 nano 打开时,在每隔一个字符之间插入一个 @
符号,并且换行符读取不正确。
似乎 fgetcsv
不支持某些编码。为了解决这个问题,我从 nano 重新创建了文件(从另一个没有显示 @
的工具复制粘贴)。