我有一个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()
函数fgetcsv()
函数应用于我的临时文件unlink()
函数这就是诀窍。所以,我怀疑一半的问题实际上是远程服务器超时,另一半是编码问题。
感谢大家对正确方向的所有推动
答案 0 :(得分:2)
文件是否正确格式化?你有没有尝试在某些csv阅读器中打开文件,你可以在其中指定分隔符和结束行)?由此判断:
那个DID导致更多的行被解析,但数据不正确,即图像列变成描述列等
我会假设数据可能已损坏(即某些描述包含逗号,结尾等)如果数据是动态生成且格式不正确,那就很高兴。
也可以在txt编辑器中打开(即notepad ++),看看它是怎么回事......
答案 1 :(得分:2)
首先,我有一些问题要问你:
$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文件中来处理所有的结构不正确。