我想使用PHP从文本文件中删除一系列数据。我们假设该文件包含以下内容:
Hello, World!
我想删除从字符2到字符7的所有内容。我需要执行此操作的实际文件非常大,所以我不想读取大文件以便删除一小部分,给定数据范围。包含在给定范围内的数据是未知的,因此str_replace或preg_replace解决方案无论如何都无法工作。
谢谢!
答案 0 :(得分:2)
无法删除文件中间的块。您将需要读取块后面的所有内容,将其向下移动以回填孔。将相关数据复制到另一个文件是一种简单的方法。
答案 1 :(得分:2)
如果由于某种原因必须使用文件,并且它是一个大文件,您可以读取较小的块(例如当时的一行),并将要保留的数据连续写入临时文件。这将减少内存需求。
答案 2 :(得分:1)
我接受了你们的建议,加上我做了一些头脑风暴,我找到了解决问题的办法。基本上我采用了Ignacio的建议:
您需要读取块后面的所有内容,将其向下移动以回填孔。将相关数据复制到另一个文件是一种简单的方法。
但是,不是将数据移动到临时文件,而是简单地读取每个块,然后立即用fseek()向后移动文件指针,并使用fwrite()填充孔。然后我用ftruncate()将文件截断到正确的长度。
再次感谢大家的建议!
答案 3 :(得分:0)
你不想但你必须这样做。读取并重写整个文件。这就是为什么每个人都会使用数据库,而不是普通文件
答案 4 :(得分:0)
这是一个比我原来的答案更好的解决方案,虽然我仍然不确定它是理想的。
您可以打开文件进行阅读,然后读取数据块,将您读入的内容放入您已打开写入的第二个文件中。然后跳过你想要“删除”的部分。
当然,最后你将临时文件复制到原文上。
修改
经过进一步的反思,我觉得这实际上可能是最有用的答案(除非/直到有人有更好的想法),但为了得出相同的结论,信用证必须转到“gnud”。
答案 5 :(得分:-1)
我能想到的最简单的方法是将整个文件作为字符串读入,并使用 array_splice string_splice删除段。
修改:
对不起,我的意思不是array_splice,我的意思是string_splice
,这是我为自己使用的自定义函数。它是这样的(我现在没有方便):
function string_splice($string, $start, $length, $replace) {
$string = substr($string, 0, $start).$replace.substr($string,$length);
}
修改
这不是理想的解决方案;请看下面的评论。将一个非常大的文件读成一个字符串是一个坏主意;除了内存消耗之外,对如此大的字符串进行操作效率非常低。更好的解决方案是 gnud 提出的解决方案。感谢。