-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行にもう1つ書きます

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

これは最も単純なワークフローです。

一時ファイルを作成します。それで:

  • 元のファイルから一度に 1 行ずつ読み取る
  • その線であなたの仕事をしてください
  • 変更された行を一時ファイルに書き込みます
  • 繰り返す。

完了したら、一時ファイルの名前を正しいファイル名に変更するだけで、古いファイルが削除されます。


各行が以前とまったく同じサイズになる場合は、代わりにファイルをインラインで変更できます。これを行うには、ファイル ポインターをfseekで正しく位置合わせしてから書き込みます。これを実現するのは少しトリッキーですが、一時ファイル用のスペースを節約できます (また、少し速くなる可能性もあります)。これは、結果のファイル サイズが元のファイル サイズとまったく同じになる場合にのみ可能です (たとえば、ある文字から別の文字に特定のバイトのみを変更する場合)。

于 2012-08-15T14:34:22.260 に答える
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 に答える
0

ファイル ストリームを読み込む場合 (たとえば、fgets; そこの例を参照)、行数を数え、行 X のカンマをセミコロンに置き換える必要があります。X + 1 に新しい行を挿入します。前の行を取得する必要はありません。

于 2012-08-15T14:34:39.983 に答える