0

2つのファイルに基づいて行われた変更をチェックするスクリプトに取り組んでいます。ファイルは共通のIDを共有し、一致する場合は5つの要素(基本情報、住所、郵便番号など)を比較する必要があります。1つ以上の要素が一致しない場合は、最初のファイルの最後にある2番目のファイルからの変更をプッシュする必要があります(後で、行われた変更を簡単に表示できます)

最初のファイルが基本であり、他のファイルは1か月後のものであり、3つの方法で変更が含まれています。最初のファイルについてはすでに説明しました。IDが一致しない場合は、新しいファイルに書き込む必要があります。これは2つの方法で発生する可能性があります。新しいファイルのIDはもう存在しません(おそらく削除されています)。これは2番目の出力ファイルになり、3番目のファイルは古いファイルのIDが存在しない場所です(それが新しいことを意味します)。

私は最初の部分である要素の比較に力を注いできました。要素を比較するのは難しいことではありませんでしたが、2番目のファイルの要素を既存の配列の最後に正しく追加する方法がわからないようです。push変数を使用すると、最後に追加されずに次の行に表示されるので、その間に新しい行があると思いますが、chompで削除しました。では、なぜこれが起こっているのでしょうか?

2番目の質問:新しい/古いIDをチェックし、独自のファイルに書き込むという2番目の部分を簡単に実行するにはどうすればよいですか。

これは私が今どこまで到達したかです(これは遠くありません)。これは単なる比較部分であり、古い(削除された)/新しいエントリを含む他の2つのファイルの書き込みを組み込む方法を引き続き機能させます。私がそれを取得しようとしている方法:

悪い:

 1204;Hotel New York;Street 4;AABBCC;New York;12345679;www.hotelnewyork.com;52.3662946;3.876277;5365;3
 783;Hotel Amsterdam;Damstraat 10;1234 AB;Amsterdam;234567890;www.hotelamsterdam.com;52.171902;4.28061;5367;4
 ;Hotel Atsterdem
 ;Damstraat 20
 1692;Hotel Berlin;Strasse 4;123456;Berlin;4567890;www.hotelberlin.com;43.218571;6.862009;5368;3
 2300;Hotel Barcelona;Avenue 3;AAA 123;Barcelona;3566677;;54.171902;6.102174;5371;4
 ;Hotel Barca                                   

良い:

1204;Hotel New York;Street 4;AABBCC;New York;12345679;www.hotelnewyork.com;52.3662946;3.876277;5365;3
783;Hotel Amsterdam;Damstraat 10;1234 AB;Amsterdam;234567890;www.hotelamsterdam.com;52.171902;4.28061;5367;4;Hotel Atsterdem;Damstraat 20
1692;Hotel Berlin;Strasse 4;123456;Berlin;4567890;www.hotelberlin.com;43.218571;6.862009;5368;3
2300;Hotel Barcelona;Avenue 3;AAA 123;Barcelona;3566677;;54.171902;6.102174;5371;4;Hotel Barca

これは私が使用しているスクリプトです。おそらく最も洗練された方法ではないことはわかっていますが、これ以上のことはできないのではないかと思います。

 #!/usr/bin/perl
 use strict;
 use warnings; 

 if ($#ARGV != 4){
print "4 namen opgeven\n";
exit;
} 

 my $inputfile1=$ARGV[0];
 my $inputfile2=$ARGV[1];
 my $outputfile1=$ARGV[2];
 my $outputfile2=$ARGV[3];
 my $outputfile3=$ARGV[4];

 open(INFILE1,$inputfile1) || die "Not found :$!\n";
 open(INFILE2,$inputfile2) || die "Not found :$!\n";
 open(OUTFILE_1,">$outputfile1") || die "In use :$!\n";
 open(OUTFILE_2,">$outputfile2") || die "In use :$!\n";
 open(OUTFILE_3,">$outputfile3") || die "In use :$!\n";

 my $i = 0;
 my $j = 0;
 my $newline = 0;

 my @infile1=<INFILE1>;
 my @infile2=<INFILE2>;

 foreach ( @infile1 ){
    s/"//g;
    my @elements = split(";",$infile1[$i]);
    chomp(@elements);
    $j = 0;

    foreach ( @infile2 ){
        s/"//g;
        my @loopelements = split(";",$infile2[$j]);
        #chomp(@loopelements);
        $newline = 0;

        if ($elements[10] == $loopelements[10]){

            $newline = 1;

            if ($elements[1] ne $loopelements[1]){
                push(@elements, $loopelements[1]."\n");
                }
            if ($elements[2] ne $loopelements[2]){
                push(@elements, $loopelements[2]."\n");
                }                   
            if ($elements[3] ne $loopelements[3]){
                push(@elements, $loopelements[3]."\n");             
                }                   
            if ($elements[4] ne $loopelements[4]){
                push(@elements, $loopelements[4]."\n"); 
                }                   
            if ($elements[5] ne $loopelements[5]){
                push(@elements, $loopelements[5]."\n");
                }   
            if ($elements[6] ne $loopelements[6]){
                push(@elements, $loopelements[6]."\n");
                }               
            } 

        $j = $j+1;
        }

if ($newline == 0){
    $elements[11] = $elements[11]."\n";
    }       

@elements = join(";",@elements);    
print OUTFILE_1 "@elements";
$i = $i+1;
}

 close(INFILE1);
 close(INFILE2);
 close(OUTFILE_1);
 close(OUTFILE_2);
 close(OUTFILE_3);  
4

1 に答える 1

0

データベースによってはるかに簡単に処理されるようなことをしているようです。デザインの変更を検討させていただきます。長期的には、あなたの人生をずっと楽にしてくれるでしょう。

MySQL のようなものをインストールするのはそれほど難しくありません。しかし、Perl でデータベースを使用するためにそれを行う必要さえありません。Perl でデータベースを提供する、完全に自己完結型のソリューションがいくつかあります。DBD::SQLiteたとえば、 を見てください。Perl モジュールをインストールするだけで、完全なデータベースが完成します。

何らかの理由でこの形式に固執している可能性があります (上司など)。ただし、ファイルをこの形式のままにしておく必要がある場合でも、ファイルをデータベースのように扱うことができます。 DBD::CSVまさにそれを行います!

于 2013-01-31T10:58:59.277 に答える