use strict; use warnings; use Text::CSV; use Data::Dumper; # define input files my $infile1 = "/tmp/data1.csv"; my $infile2 = "/tmp/data2.csv"; # prepare csv parser (no need for clean() any more) my $csv = Text::CSV->new( { sep_char => ',', allow_whitespace => 1, binary => 1 } ); # open input files open my $csv_1, '<', $infile1 or die "open($infile1,r) failed: $!"; open my $csv_2, '<', $infile2 or die "open($infile2,r) failed: $!"; ### prepare data of data2.csv <$csv_2>; # ignore timestamp line of $infile2 my @columns2 = @{ $csv->getline($csv_2) }; # get column names my @values = @{ $csv->getline($csv_2) }; # get values my %data2; for my $i ( 0 .. $#columns2 ) { # fill %data2 with content # fill value with empty string if value not defined $data2{$columns2[$i]} = defined $values[$i] ? $values[$i] : ''; } # check %data2 warn Data::Dumper->Dump( [ \%data2 ], [ '*data2' ] ) if $ENV{DEBUG}; ### process data of data1.csv my @colums1; while ( my $row = $csv->getline( $csv_1 ) ) { next if 0 == $#{$row}; # skip empty lines next if 6 == $#{$row}; # skip lines with too less columns my ( $significator, $filename ) = split m{\s+}, $row->[0]; # store column names if ( $significator eq 'default' ) { @colums1 = @$row; shift @colums1; warn Data::Dumper->Dump( [ \@colums1 ], [ '*columns1' ] ) if $ENV{DEBUG}; } elsif ( $significator eq 'false' ) { warn Data::Dumper->Dump( [ $row ], [ '*row' ] ) if $ENV{DEBUG}; open my $wh, '>', $filename or die "open($filename,w) failed: $!"; printf $wh "%s:\n", $filename; shift @$row; for my $i ( 0 .. $#{$row} ) { printf $wh "%-10s %-10s %-10s\n", $colums1[$i], $data2{$colums1[$i]}, $row->[$i]; } close $wh or die "close($filename,w) failed: $!"; } } __END__ content of data files (between --8<--): data1.csv: --8<-- 20150714 00:08:49 false, false, false, false, true, true, default, ame_a, ame_m, ame_uc, ame_f, ams_l, enced_affi, true DPA01, fault, fault, fault, fault, fault, 1, false DPA02, , , , , fault, 1, false DPA03, fault, fault, olt, fault, fault, 1, false DPA04, fault, at, fault, 2, fault, 1, --8<-- data2.csv: --8<-- 20150616 22:16:09 default, ame_a, ame_m, ame_uc, ame_f, ams_l, enced_affi, default, fault, fault, fault, fault, fault, 1, --8<--