-1
/* format of the files:123|0|15454215|desc|11/30/2012|N|Y|
open FILE1, "/home/1.txt" or die $!;
open FILE2, "/home/2.txt" or die $!;

while (<FILE2>) {
  @old_item = split(/\|/);
  if (<FILE1> !~ /$old_item[0]\|$old_item[1]\|$old_item[2]/) {
    print "$old_item[0]|$old_item[1]|$old_item[2]|$old_item[3]|$old_item[4]|$old_item[5]|$old_item[6]|DE|\n";
  }
}

ここで行っているのは、2つのファイルを開き、それらを比較して最初の行にあり、2番目の行にない行を見つけて、古い情報と新しい情報を含む行を出力することです。

しかし、何が起こっているのかというと、2番目のファイルにはないが、最初のファイルにはある行が見つかると、すべての行の印刷が開始されます。私は何を間違っているのですか、そしてもっと簡単な方法があります。

4

5 に答える 5

6

diff -uなどを使用しないのはなぜですか?Perl ソリューションが必要な場合は、Algorithm::Diffを調べてください。

于 2012-08-27T20:01:19.293 に答える
1

perl には 2 つのファイルを比較するためのモジュールがあります。

ALgorithm::Diff モジュール、

Algorithm::Diff - 2 つのファイル / リスト間の「インテリジェントな」差異を計算します。これにより、2 つのファイルが行ごとに比較され、完全にチェックされます。

于 2016-07-18T10:50:38.820 に答える
1

各ファイルを1行ずつ読み取っているため、行を追加するとすべての行がオフになるため、何が起こっていると思います(ファイルの1つは、いわばカウントが1行進むためです)。このための独自の perl コードを引き続き書きたい場合は、ファイルを配列フィストにロードして比較し、必要な場合にのみインデックスをインクリメントすると役立つ場合があります。

于 2012-08-27T20:05:15.077 に答える
0

あなたのデータを見ることは役に立ちます。しかし、知識に基づいた推測を行う..デバッガーでこれを見ていくと、何が起こっているのかがわかると思います.行が見つからない場合は、両方のストリームの次の入力行にスキップします.

これで、残りの入力について、1 つずれる問題が発生しました。

于 2012-08-27T20:04:14.063 に答える
0

発生している理由は、ラインが長く同期されていない違いを見つけたからです。

ファイル リーダーを再同期するには、一致する行を検索するコードを追加する必要があります。

于 2012-08-27T20:04:26.893 に答える