0

60個の異なる新しい値に置き換える必要がある60個の値を持つフラットファイル(csv区切り)があります。

Original_Value1 ---> New_Value1
Original_Value2 ---> New_Value2
Original_Value3 ---> New_Value3
Original_Value4 ---> New_Value4

....から60。

このファイルには、変更が必要な60個の値を持つ200kを超えるエントリがあります。これを達成するための最も効率的な方法は何ですか?

4

4 に答える 4

0

サンプルコードは次のとおりです。

$input  = 'input.txt';
$output = 'output.txt';

if ($fpin = fopen($input, 'r')) {
  if ($fpout = fopen($output, 'a')) {
    while ($data = fread($fpin, 1024)) {
      fwrite($fpout, your_replacement_function($data));
    }

    fclose($fpout);
  }

  fclose($fpin);
}
于 2012-06-12T18:37:32.117 に答える
0

fgetcsvファイルを1行ずつ読み取り、コードを追加して、各行に置換する文字列が含まれているかどうかを確認してください。

各行を読んだ後、必要なことを実行して、新しいファイルに書き込みます。fputcsvCSVの作成に使用できます。最後に古いファイルを削除します。

たぶん誰かがファイルの途中を編集する方法を知っていますか?それは不可能だと思います。

于 2012-06-12T18:38:36.827 に答える
0

仮定

1) 古い値と新しい値の長さは異なる場合があります

2) 事前に変更する値が含まれている行がわからない

fgetcsv() を使用して行ごとにファイルをループし、その行のフィールドを検査し、必要に応じて置換を行います。fputcsv() を使用して別のファイルに行を書き戻します

于 2012-06-12T18:35:25.503 に答える
0

パール。少なくともそれは私のアドバイスです.1行でそれを行うことができるはずです....

open( IN, " < filename.csv ");
open( OUT, " > output.csv ");

while (<IN>) { # reads in each line of the file
   $line =~ s/Original_Value1/New_Value1/gi;  # g is for global, i is to ignore case
   $line =~ s/Original_Value2/New_Value2/gi;  # g is for global, i is to ignore case
   $line =~ s/Original_Value3/New_Value3/gi;  # g is for global, i is to ignore case
   # ... continue to your values... probably a better way of doing this from a file, but this is quick and dirty, and should work
   print OUT $line; # prints out $line to the output file.
}
close(IN);
close(OUT);

とにかく近いでしょう。私はかなり長い間 perl を書いていません。おそらく、PERL ゴルフが得意な人によって、数文字に最適化される可能性があります... =)

于 2012-06-12T18:36:53.770 に答える