-1

我有大 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 行(取决于计数器)到文件末尾执行此操作

4

3 回答 3

1

这是最简单的工作流程:

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

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

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


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

于 2012-08-15T14:34:22.260 回答
0

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

于 2012-08-15T14:34:39.983 回答
0

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

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

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

于 2012-08-15T15:24:09.483 回答