gpt4 book ai didi

PHP fgetcsv() 没有读取所有行

转载 作者:行者123 更新时间:2023-12-04 03:12:34 24 4
gpt4 key购买 nike

我有一个 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 作为我的行结尾有关。我试过\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() 函数删除临时文件

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

感谢大家在正确方向上的所有插入

最佳答案

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

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

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

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

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 文件中,以处理所有很少有不正确的结构。

关于PHP fgetcsv() 没有读取所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5579740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com