【发布时间】:2015-10-29 20:31:59
【问题描述】:
我正在尝试使用 fgetcsv 读取 CSV 行。然而,它似乎根本不关心外壳。
下面是这条线的样子:
Super Administrator,"ROLE_SUPER_ADMIN, ROLE_GROUP_GUEST, ROLE_GROUP_WRITER, ROLE_USER_WRITER, ROLE_USER_GUEST"
这是 CSV 标准的有效行,它应该返回以下内容,并以 " 作为附件,, 作为分隔符:
$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 错误,但也可能是一些安装/配置问题,因此我发布此问题。
有人经历过吗? 解决此问题的最佳方法是什么?
编辑:
正如 Mark Baker 所指出的,PHP5.5.27-1 实际上是目前 PHP5.5 的最新版本。
编辑 2:
这是bin2hex 函数的尝试,显示为var_dump。
行读取",",","(2 个单元,每个单元中仅包含一个昏迷):0022002c0022002c0022002c0022000a。
使用bin2hex('"'),结果就是22。
str_getcsv 仍然给我这个错误。
【问题讨论】:
-
5.6.11 是 PHP 的最新版本,而不是 5.5.27.... 这只是 5.5 分支中的最新版本
-
但是 str_getcsv() 函数 - 它在内部使用相同的解析代码 - 可以在所有版本的 PHP 上正常工作,回到 5.3.0(当引入 str_getcsv() 时)......你绝对确保文件中的附件是
"(ASCII 0x22) 字符,而不是&quot或类似字符 -
感谢 PHP 修订的精确性。关于你的第二条评论,是的,我很确定。实际上我使用的是 LibreOffice(Ubuntu 上的一个 excel ripoff),它是软件,而不是我,添加了
"。即便如此,当我在文本编辑器中打开文件时,会显示"字符,而不是其他任何内容。 -
在字符串上尝试
bin2hex()或使用十六进制编辑器来确保"实际上都是ASCII 0x22。 -
在这里工作得很好(从 PHP 5.1.0 开始),当我将给定的字符串写入临时文件时:3v4l.org/6UV1V