在php中使用巨大的文件

时间:2012-08-15 14:27:25

标签: php mysql sql file

我有大的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 VALUES

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

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行(取决于计数器)到文件末尾

执行此操作

3 个答案:

答案 0 :(得分:1)

这是最简单的工作流程:

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

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

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


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

答案 1 :(得分:0)

如果你读入文件流(例如通过fgets;参见那里的例子),你应该计算行数并用第X行的分号替换逗号;并在X + 1处插入一个新行。无需获取上一行。

答案 2 :(得分:0)

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

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

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