2012-03-07 93 views
3

我有以下代码:fgetcsv返回太多的条目

while (!feof($file)) { 
     $arrayOfIdToBodyPart = fgetcsv($file,0, "\t"); 
      if (count($arrayOfIdToBodyPart)==2){ 

的问题是,该文件的内容是这样的:

39  ankle 
40  tibia 
41  Vastus Intermedius 

有时,在if中的测试会显示三个条目,其中第一个是数字,第二个是名称,第三个只是... emtpy。

这会导致if块失败,并且我很难过。我知道我可以让if block测试> = 2,但是有什么办法可以让我认识到有两个项目的事实吗?我不喜欢fgetcsv在行尾找到“神秘”角色。

这可能是一个unix服务器运行基于Windows的文件错误?如果是这样,并且我在没有dos2unix的情况下运行Ubuntu服务器,我在哪里得到它?

+1

+1对您的代码/数据中的问题的情绪反应 – thetaiko 2012-03-07 17:59:22

+0

尝试执行CSV文件的[hex转储](http://en.wikipedia.org/wiki/Hex_editor)以查看文件的内容是否与您的期望;实际内容可能与您的初始假设不同。有必要使用十六进制编辑器而不是文本编辑器来完成此操作,因为后者不会总是区分PHP确实会以不同方式处理的字节。 – 2012-03-07 18:11:18

+0

我的猜测是在NL char(\ n)之前的CR chars(\ r)。使用'dos2unix文件名'来清理它们。祝你好运。 – shellter 2012-03-07 20:01:06

回答

0

你可能有标签在一行的末尾:

value<tab>value<tab><newline> 

如果是这样的话,DOS2UNIX的不会帮你。你可能需要做一些事情,比如将每行读入一个变量,trim()该变量,然后使用str_getcsv()来分割它。

0

是否有可能在这些行的结尾处有一个制表符?它们是无形的,往往很难找到......你可能想仔细检查。

此外,如果你正在使用CSV文件的工作,而你是在本地运行Windows和服务器是UNIX,我发现这行:

ini_set('auto_detect_line_endings', true); 

节省了许多烦恼。