num|name
1|foo
12|bar
15|bar
18|baz
25|quux
27|quux
37|quuux
48|quuuux
####
file1:
acct|description|nums
foo-001|foo one|1,12,27,37
foo-002|foo two|1,15,25,37
foo-003|foo three|1,18,25,37
foo-004|foo four|12,18,25,37
foo-005|foo five|12,15,25,27,37
foo-006|foo six|1,12,25,27,37,99
file2:
acct|description|nums
foo-001|foo one|1,12,15,27,37
foo-002|foo two|1,15,25,37
foo-003|foo three|1,18,25
foo-004|foo four|12,18,25,37
foo-005|foo five|12,15,25,27,37
foo-006|foo six|1,12,15,25,27,37,99
file3:
acct|description|nums
foo-001|foo one|1,12,15,18,27,37
foo-002|foo two|1,15,25,37
foo-003|foo three|1,18,25
foo-004|foo four|12,18,25,37
foo-005|foo five|12,15,25,27,37
foo-006|foo six|1,12,15,25,27,37,99
##
##
$hash => {
file1 => {
foo => 4,
bar => 6,
baz => 4,
quux => 8,
quuux => 6,
quuuux => 0,
},
file2 => {
foo => 4,
bar => 8,
baz => 4,
quux => 8,
quuux => 5,
quuuux => 0,
},
file3 => {
foo => 4,
bar => 8,
baz => 5,
quux => 8,
quuux => 5,
quuuux => 0,
},
}
##
##
name file1 file2 file3
foo 4 4 4
bar 6 8 8
baz 4 4 5
quux 8 8 8
quuux 6 5 5
quuuux empty empty empty
##
##
name file1 file2 %change file3 %change
foo 4 4 0% 4 0%
bar 6 8 133% 8 0%
baz 4 4 0% 5 125%
quux 8 8 0% 8 0%
quuux 6 5 -83% 5 0%
quuuux empty empty empty
##
##
my $hash = {};
my @heading = ( 'name' );
my @report;
for my $fn ( sort @filenames ) {
open my $fh, '<', $fn
or die "Error opening file ${fn}: $!\n";
# Read in each filename and populate the hash
#
while (<$fh>) {
chomp;
s%\r%%;
my @line = split /\|/;
my @curnums = split( ',', $line[2] );
for my $curnum ( @curnums ) {
next unless $defined $nums_to_names->{$curnum};
if ( ! defined $hash->{$fn} or ! defined $hash->{$fn}->{$curnum} ) {
$hash->{$fn}->{$curnum} = 1;
} else {
$hash->{$fn}->{$curnum}++;
}
}
}
# Iterate the mapping of numbers to names
#
for my $curnum ( sort keys %$nums_to_names ) {
my @report_line;
# Skip it unless it's defined and has a value
#
my $name =
defined $nums_to_names->{$curnum}
&& $nums_to_names->{$curnum}
? $nums_to_names->{$curnum}
: next
;
push @report_line, $name;
# For the current mapping number, pluck the corresponding counts
# related to each file
#
for my $curfilename ( sort keys %$hash ) {
my $count =
defined $hash->{$curfilename}->{$curnum}
&& $hash->{$curfilename}->{$curnum}
? commify($hash->{$curfilename}->{$curnum})
: 'empty'
;
push @report_line, $count;
}
push @report, \@report_line;
}
}
push @heading, basename($_) for sort @filenames;