我正在编写一个脚本,该脚本将检查基于 2 个文件所做的更改。这些文件共享一个共同的 ID,如果匹配,则必须比较 5 个元素(包括基本信息、地址、邮政编码等)。如果一个或多个元素不匹配,则应将第二个文件中的更改推送到第一个文件的末尾(因此之后我可以轻松查看所做的更改)
第一个文件是基础,另一个文件是一个月后的,包含三个方面的更改:我已经介绍了第一个。如果 ID 不匹配,则应将其写入新文件。这可能以两种方式发生:新文件中的 id 不再存在(因此它可能已被删除),这将是第二个输出文件,第三个文件是旧文件中的 id 不存在的位置(其中表示它是新的)。
我一直把精力集中在第一部分,元素的比较上。比较元素并不难,但我似乎无法弄清楚如何将第二个文件中的元素正确添加到现有数组的末尾。当我使用 push 变量时,它不会在最后添加,而是显示在下一行,所以我认为中间有一个新行,但我用 chomp 删除了它。那么为什么会这样呢?
第二个问题:如何轻松完成第二部分,检查新/旧 ID 并写入他们自己的文件。
这就是我现在走了多远(不远)。这只是比较部分,仍在研究如何合并编写包含旧(已删除)/新条目的其他 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);