PHP fgetcsv()没有读取所有行

时间:2011-04-07 10:37:50

标签: php csv fgetcsv

我有一个PHP脚本正在读取远程CSV文件,并根据CSV文件的内容将产品添加到数据库。目前大约有2800行(产品),但脚本一直停在1388行。

我使用的代码如下:

while(($data = fgetcsv($fopen, 0, ",")) !== false):
  //stuff is done here...
endwhile;

我已将php内存限制设置为64M,甚至尝试了128M。我还将max_execution_time设置为60分钟。我也试过改变代码如下:

while(($data = fgetcsv($fopen, 1000, ",", '\r')) !== false):
  //stuff is done here...
endwhile;

那个DID导致更多的行被解析,但是数据不正确,即图像列正在成为描述列等。我认为这与添加\ r作为我的行结尾有关。我试过了,没有运气。最后,我还在ini中将auto_detect_line_endings添加为true。

有人可以说明我的数据被缩短的原因吗?

此致 西蒙

修改

我注意到一些有趣的事情。我在每行上都有一个MySQL插入,在上面的代码中循环。现在,我的数据库中的最后一条记录是CSV文件中的第一行,这是否意味着文件正在从最后一行解析?

这些似乎是休息时或附近的行:

W-3066,  I Love Love Cheap And Chic,     Moschino, 3.4 oz,EDT Spray,Women,,"Introduced by the design house of Moschino, I love love has a blend of grapefruit, orange, lemon, red currant, tea rose, cinnamon leaves, musk, cedar and tonka wood. It is recommended for daytime wear.",http://www.perfume-worldwide.com/products/Women/Final/W-3066large.jpg,0,0,0,8011003991457
W-3070,  Adidas Floral Dream,            Adidas,   1.7 oz,EDT Spray,Women,,"Introduced in 2008, the notes are bergamot, lily, rose, tonka bean and vanilla.",http://www.perfume-worldwide.com/products/Women/Final/W-3070large.jpg,0,0,0,3412244310024
W-3071,  Adidas Fruity Rhythm,           Adidas,   1.7 oz,EDT Spray,Women,,"Introduced in 2008, the notes are black currant, raspberry, cyclamen, freesia and musk.",http://www.perfume-worldwide.com/products/Women/Final/W-3071large.jpg,0,0,0,3412244510004

事实证明,对我来说,将文件复制到我的服务器并解决副本效果要好得多。我遵循的步骤如下:

  • 我使用file_get_contents()
  • 读取了远程文件的内容
  • 然后我使用iconv()函数将数据重新编码为UTF-8
  • 我使用fopen()fwrite()fclose()函数创建了一个临时文件,该文件的内容是上面的编码数据
  • 我使用chmod()函数
  • 将文件的权限设置为0750
  • 然后我将fgetcsv()函数应用于我的临时文件
  • 是否需要完成所有这些
  • 使用unlink()函数
  • 删除临时文件

这就是诀窍。所以,我怀疑一半的问题实际上是远程服务器超时,另一半是编码问题。

感谢大家对正确方向的所有推动

2 个答案:

答案 0 :(得分:2)

文件是否正确格式化?你有没有尝试在某些csv阅读器中打开文件,你可以在其中指定分隔符和结束行)?由此判断:

  

那个DID导致更多的行被解析,但数据不正确,即图像列变成描述列等

我会假设数据可能已损坏(即某些描述包含逗号,结尾等)如果数据是动态生成且格式不正确,那就很高兴。

也可以在txt编辑器中打开(即notepad ++),看看它是怎么回事......

答案 1 :(得分:2)

首先,我有一些问题要问你:

  • 什么是 1388 1388 1389
  • 是否输出错误
  • 当你到达最后一行时,你得到一个($data[0] === null

关于内存限制的信息可能不是引起它的问题,因为fgetcsv每次迭代读取一行,内存中一次只有1行数据。

如果您继续将数据放入数组中,或将它们连接在一起,则在您的lop中。这可能会导致内存泄漏,但您必须在深度代码中显示更多内容

CSV文件必须非常结构化,fgetcsv能够正确解析它,使用CSV文件时要记住一些规则:

  • 第一行必须始终为列名
  • 所有其他行都是数据行:
    • 每个元素,
    • 分隔
    • 如果某个元素包含空格或逗号,'\n''\r''\r\n',则应将其用双引号括起来

有效CSV文件的示例应如下所示:

id, firstname, lastname, age, profile_description
0,  Robert,    Pitt,     22,  "this string has spaces, and has a comma"

你应该验证结构是否正确,如果它不正确那么你应该解决这个问题,直到解析能够正确读取数据,然后你可以干净地将数据放入一个新的CSV文件中来处理所有的结构不正确。