Sure. Here's a script that parses two files and compares the values for each key using List::Compare:
#!/usr/bin/perl
use strict;
use warnings;
use feature qw/say/;
use List::Compare;
use List::AllUtils qw/uniq/;
sub parse_file($) {
my ($filename) = @_;
open my $filehandle, "<", $filename
or die "Could not open $filename: $!";
my %parsed = ();
while(<$filehandle>) {
chomp;
my ($key, $values) = split "=", $_, 2;
my @values = split ",", $values;
$parsed{$key} = \@values;
}
return \%parsed;
}
my %parsed_file1 = %{ parse_file "File1" };
my %parsed_file2 = %{ parse_file "File2" };
foreach my $key (sort { $a cmp $b } uniq (keys %parsed_file1, keys %pa
+rsed_file2)) {
my $listcompare = List::Compare->new($parsed_file1{$key} // []
+, $parsed_file2{$key} // []);
my @added_values = $listcompare->get_Ronly;
my @removed_values = $listcompare->get_Lonly;
my @retained_values = $listcompare->get_intersection;
say $key;
say "\tValues added : ", join ", ", @added_values;
say "\tValues removed : ", join ", ", @removed_values;
say "\tValues retained: ", join ", ", @retained_values;
}
Here's my File1:
B23168=AOL,ABC
permitted_mac_attempts=1,DEF
B23167=Carphone Warehouse TalkTalk,23
B23163=Orange,Red,Blue,Green,White,Black
B23970=O2
APPLE=FRITTER
And my File2:
B23168=AOL,ABC,DEF,EFG
permitted_mac_attempts=1,DEF,34,4
B23167=Carphone Warehouse TalkTalk,23,5,6
B23163=Orange,Red,Blue,Green,Yellow
B23970=O2,56
PONY=EARTH
Using these, the script outputs:
$ perl 1119397.pl
APPLE
Values added :
Values removed : FRITTER
Values retained:
B23163
Values added : Yellow
Values removed : Black, White
Values retained: Blue, Green, Orange, Red
B23167
Values added : 5, 6
Values removed :
Values retained: 23, Carphone Warehouse TalkTalk
B23168
Values added : DEF, EFG
Values removed :
Values retained: ABC, AOL
B23970
Values added : 56
Values removed :
Values retained: O2
PONY
Values added : EARTH
Values removed :
Values retained:
permitted_mac_attempts
Values added : 34, 4
Values removed :
Values retained: 1, DEF
$
Writing to a CSV file is left as an exercise for the reader (I don't know how you want your CSV file to look anyway), but I'd strongly suggest using Tux's excellent Text::CSV module.
|