【问题标题】:PHP fgetcsv() not reading all linesPHP fgetcsv()没有读取所有行
【发布时间】:2011-04-07 10:37:50
【问题描述】:

我有一个 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;

这确实导致更多行被解析,但是数据不正确,即图像列正在成为描述列等。我认为这与添加 \r 作为我的行尾有关。我试过\n,没有运气。最后,我还在 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()函数删除临时文件

成功了。所以,我怀疑一半的问题实际上是远程服务器超时,另一半是编码问题。

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

【问题讨论】:

  • 您的 CSV 似乎可以包含原始二进制图像数据(进入您所说的“图像列”)...您确认了吗?
  • @Frosty - 不,图像列只是一个代码,例如 w-12345
  • 关于您的编辑,我们确实需要查看 CSV 样本,如果我们不知道原因,我们将无法解决问题。
  • 不需要[SOLVED] 前缀,如果答案被标记为正确,则它会被区分为不同的颜色。

标签: php csv fgetcsv


【解决方案1】:

首先我有几个问题要问你:

  • 138813881389线上有什么
  • 是否有错误输出
  • 当你到达最后一行时,你会得到一个 ($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 文件中,处理所有一些不正确的结构。

【讨论】:

  • @Robert - 我会看看那一行,以及输出最后一行的数据,看看是否为空,应该是吗?问题是我无法控制数据,CSV 文件每晚动态生成并从数据库记录中填充。我现在看看,然后回复你
  • 如果数组的第一个元素是null,这表示fgetcsv由于上述语法问题而无法解析该行,如果可以请提供3行声明,以便我们可以查看它们。
  • @Robert - 以上三行,我正在等待 php 脚本完成运行,之后我将粘贴最后解析行的输出。感谢大家的帮助
  • 似乎 CSV 文件对我来说也很好,它可以很好地解析 2.6K 行,所以一定是其他原因导致问题尝试将错误更改为 On >> @987654329 @
  • @robert - 有趣的是,当我在 OopenOffice.org 中打开 CSV 文件并再次另存为 CSV 时,它解析了所有行,但数据仍然不稳定。不知道是不是编码问题?
【解决方案2】:

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

这确实导致更多行被解析,但数据不正确,即图像列正在成为描述列等

我会假设数据可能已损坏(即某些描述有逗号、结束线等)如果数据是动态生成且格式不正确,则会发生这种情况。

也可以在 txt 编辑器中打开(即记事本++),看看效果如何。

【讨论】:

  • 谢谢,现在在记事本++中检查
猜你喜欢
  • 1970-01-01
  • 2013-03-23
  • 2016-06-20
  • 1970-01-01
  • 2016-12-15
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
相关资源
最近更新 更多