在 php 中处理大文件


Work with huge file in php

我有一个很大的sql文件,我需要在那里更改一些行,现在我的文件中有这样的数据

 INSERT INTO `LINK_LA_TYP` VALUES
 ('1','8917181','1','24','2'),
 ('1','8934610','1','24','1'),
 ('1','9403766','1','30','1'),
 ('1','9422299','1','30','2'),

这样做了,例如$count行我再写一个

插入到LINK_LA_TYP

但是我的文件看起来像这样:

INSERT INTO `LINK_LA_TYP` VALUES
 ('1','8917181','1','24','2'),
 ('1','8934610','1','24','1'),
 ('1','9403766','1','30','1'),
 INSERT INTO `LINK_LA_TYP` VALUES
 ('1','9422299','1','30','2'),

但是我需要前面的行符号,更改为;如何在大文件中执行此操作?所以我需要查看文件并在那里写行(完成),然后将 更改为 ;在上一行上,并在每 ~500 行(取决于计数器)上执行此操作,直到文件末尾

这是最简单的工作流程:

创建一个临时文件。然后:

  • 从原始文件中一次读取一行
  • 在这条线上做你的工作
  • 将更改的行写入临时文件
  • 重复。

完成后,只需将临时文件重命名为正确的文件名,即可删除旧文件。


如果每行的大小与以前完全相同,则可以改为内联更改文件。您可以通过将文件指针与 fseek 正确对齐,然后写入来执行此操作。这有点难以实现,但可能会为您节省临时文件的空间(并且可能也会更快一点)。仅当生成的文件大小与原始文件大小完全相同(例如,如果您仅将某些字节从一个字符更改为另一个字符)时,才有可能。

如果您在文件流中读取(例如通过 fgets ;请参阅此处的示例),您应该计算行数并将逗号替换为第 X 行的分号;并在 X + 1 处插入一个新行。无需获取前一行。

花了一些时间一起嘲笑这个。

sed -i ':a;N;$!ba;s/,'n INSERT INTO/;'n INSERT INTO/g' your_file.sql

如果你真的想从 php 脚本运行它,你可以把它放在 exec() 中。