我可以同时读写csv文件吗?

时间:2014-04-30 21:55:37

标签: php magento csv file-io

我想每次在每个循环中从上到下阅读 csv 文件,并检查相同的内容是否已经存在,用新内容覆盖它。例如,如果产品ID相同,则使用同一行中的新数据覆盖旧数据。

目前,我正在使用 fgetcsv 逐行阅读 csv 文件。是否有一种方法可以在读取 csv

时写入同一行

2 个答案:

答案 0 :(得分:0)

  

有没有一种方法可以在读取csv时写入同一行?

简短回答:不。

答案很长:是的,但这非常困难,通常你只想完全从头到尾重写文件。

假设您有一个包含以下内容的文件:

The quick brown fox jumped over the lazy dog.

并且您想要将jumped更改为jumps。 “简单!”你可能会想,“我只会更改单词”。你查找文件IO以及如何移动指针,寻找单词“jumped”开头的位置并写入“jumps”。现在你有:

The quick brown fox jumpsd over the lazy dog.
噢,哦,那不对。我们需要删除该错误d。怎么样?通过将文件中的每个字节向上移位一个字节。由于小的疏忽和奇怪的角落情况,这是一项繁琐的操作和破坏数据的好方法。 [1到3个字节的UTF字符?物料清单?]如果您需要插入更长的单词而不是原始jumped,则会遇到更多麻烦。

想想像砖墙这样的文件。很容易在墙的顶部附加一排新的砖块,但是如果你想在中间添加一块额外的砖块,你可能只需将整块砖块重新敲打并重建。

如果您有一组需要就地修改的数据,那么存储它的最差位置就是CSV或XML文件等平面文件。按照Dagon的建议,将数据放在它所属的数据库中。

没有数据库服务器?查看SQLite

答案 1 :(得分:-1)

在这里忘记你的实现,你要问最快的方法来检查文件是否在循环中发生了变化。我虽然第一个校验和可能是合理的但可能比你想象的要长一些。 How to generate a md5 checksum for a CSV file in JSP

下一个选项是使用file.GetlastWriteTime()。跳过循环,检查它是否与上次使用时相同。 http://msdn.microsoft.com/en-us/library/system.io.file.getlastwritetime(v=vs.100).aspx

woops ...没有注意到你正在使用PHP。我相信这两种选择都有类似的方法。