【发布时间】: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]前缀,如果答案被标记为正确,则它会被区分为不同的颜色。