我想每次在每个循环中从上到下阅读 csv 文件,并检查相同的内容是否已经存在,用新内容覆盖它。例如,如果产品ID相同,则使用同一行中的新数据覆盖旧数据。
目前,我正在使用 fgetcsv 逐行阅读 csv 文件。是否有一种方法可以在读取 csv ?
时写入同一行答案 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。我相信这两种选择都有类似的方法。