我正在尝试使用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
仍然给了我这个错误。
答案 0 :(得分:1)
好的,解决了。
这是每个人都怀疑的:文件的编码搞砸了。我不知道这是哪种编码,但只要我试图打开CSV,LibreOffice就会提出Unicode。
我必须用nano打开它们才能意识到确实存在编码问题。我在计算机上使用的Gedit,vim或任何其他工具都没有出错。使用nano打开时,在每个其他字符之间插入@
符号,并且无法正确读取换行符。
fgetcsv
似乎有一些编码没有得到很好的支持。为了解决这个问题,我从nano重新创建了文件(从另一个没有显示@
的工具复制粘贴。)