diffとcommを見てください。これらはあなたが望むことをするかもしれません。
いくつか質問があります。
- これらのファイルが行ごとに 1 つの値しか持たない場合、それらが CSV ファイルになる理由は何ですか? CSV ファイルには、カンマで区切られた複数の列があります (CSV = カンマ区切り値)。何か他に何かありますか。
- 両方のファイルの値が同じであるが、2 つの異なる場所にある場合、それを差分としてカウントしますか? 1 つのファイルに 3 行があり、その行に
1, 2, 3
. その中の 2 番目のファイルと比較して1, 3, 2
います。2行目と3行目が違う?または、同じ値が含まれているため、ファイルは同じですか?
いいえ、両方のファイルの異なる場所に同じ値がある場合、この値は出力に含まれるべきではありません。あなたの例では、2 つのファイル (1,2,3) と (1,3,2) は同じです。– Yoboy 7時間前
結構...
グループ #2 タイプの質問でグループ #1 の項目があるときはいつでも、ハッシュを考える必要があります。
ハッシュは、各値がキーを持つ値のリストです。リスト内で値が重複する可能性がありますが、特定のキーのインスタンスは 1 つだけです。これは、キーが既にリストにあるかどうかを簡単に確認できることを意味します。
ファイル #1 を取得し、各値をキーとしてハッシュに入れることを想像してください。値が何であるかは関係ありません。単にキーに関心があるだけです。
ここで、ファイル #2 を調べると、そのキーが既にハッシュに含まれているかどうかをすぐに確認できます。そうであれば、それは重複値です。
ハッシュの 2 番目の機能を利用することもできます: キーのインスタンスは 1 つしか許可されません。両方のハエを 1 つのハッシュに入れるとどうなるでしょうか? ファイル #1 とファイル #2 の間で値が重複していても問題ありません。そのキーのインスタンスは 1 つだけです。
両方のファイルで一意の値のリストを取得する方法は次のとおりです。
use strict;
use warnings;
use feature qw(say);
use autodie;
use constant {
FILE_1 => "file1.txt",
FILE_2 => "file2.txt",
};
my %hash;
#
# Load the Hash with value from File #1
#
open my $file1_fh, "<", FILE_1;
while ( my $value = <$file1_fh> ) {
chomp $value;
$hash{$value} = 1;
}
close $file1_fh;
#
# Add File #2 to the Hash
#
open my $file2_fh, "<", FILE_2;
while ( my $value = <$file2_fh> ) {
chomp $value;
$hash{$value} = 1; #If that value was in "File #1", it will be "replaced"
}
close $file2_fh;
#
# Now print out everything
#
for my $value ( sort keys %hash ) {
say $value;
}
これは出力されます:
123
124
125
126
127
必要なのは、一意の値のリストです。これは、最初に思われるよりも少しトリッキーです。ファイル #1 の値をハッシュに入れ、ファイル #1 にない場合はファイル #2 の値を出力できます。これにより、ファイル #2 の一意の値のリストが得られますが、ファイル #1 の一意の値は得られません。
したがって、ファイル #1 用とファイル #2 用に 1 つずつ、合計 2 つのハッシュを作成し、それぞれを調べて相互に比較する必要があります。
use strict;
use warnings;
use feature qw(say);
use autodie;
use constant {
FILE_1 => "file1.txt",
FILE_2 => "file2.txt",
};
#
# Load Hash #1 with value from File #1
#
my %hash1;
open my $file1_fh, "<", FILE_1;
while ( my $value = <$file1_fh> ) {
chomp $value;
$hash1{$value} = 1;
}
close $file1_fh;
#
# Load Hash #2 with value from File #2
#
my %hash2;
open my $file2_fh, "<", FILE_2;
while ( my $value = <$file2_fh> ) {
chomp $value;
$hash2{$value} = 1;
}
close $file2_fh;
ここで、一方を他方と比較する必要があります。今のところ、値を配列に格納します。
my @array;
#
# Check if File #1 has unique values vs File #2
#
for my $value ( %keys %hash1 ) {
if ( not exists $hash2{$value} ) {
push @array, $value; #Value in File #1, but not in File #2
}
}
#
# Check if File #2 has unique values vs File #1
#
for my $value ( %keys %hash2 ) {
if ( not exists $hash1{$value} ) {
push @array, $value; #Value in File #2, but not in File #1
}
}
#
# Now print out what's in @array of unique values
#
for my $value ( sort @array ) {
say $value;
}