I recieved some great help matching data from 2 files, I now need to append a carryover file to file1. When I append data to file1 (carry over data from previous month it contains -C) it does not match up with the car number. I am not sure if it is the formatting in the carryover file. Thanks for your help...

output file: ACFX 28523 L 05/18/13 ABCCO ACFX 28526 L 05/28/13 ABCCO ACFX 44866 L 05/28/13 ABCCO ACFX 28523 L 05/01/13 ABCCO-C ACFX 28526 L 05/01/13 ABCCO-C ACFX 44866 L 05/01/13 ABCCO-C ADMX 49266 L 05/03/13 05/16/13 PFGCO ADMX 63770 L 05/12/13 05/21/13 PFGCO ADMX 63975 L 05/12/13 05/30/13 PFGCO file1: ADMX 49266, L , 05/03/13, PFGCO ADMX 63770, L , 05/12/13, PFGCO ADMX 63975, L , 05/12/13, PFGCO file2: ADMX 49266, L , 05/16/13, PFGCO ACFX 28523, L , 05/18/13, ABCCO ADMX 63770, L , 05/21/13, PFGCO ACFX 28526, L , 05/28/13, ABCCO ACFX 44866, L , 05/28/13, ABCCO ADMX 63975, L , 05/30/13, PFGCO carry-over file (I append to bottom of file1) ACFX 28523, L, 05/01/13, ABCCO-C ACFX 28526, L, 05/01/13, ABCCO-C ACFX 44866, L, 05/01/13, ABCCO-C I need the output file to read like this: ACFX 28523 L 05/01/13 05/18/13 ABCCO-C ACFX 28526 L 05/01/13 05/28/13 ABCCO-C ACFX 44866 L 05/01/13 05/28/13 ABCCO-C ADMX 49266 L 05/03/13 05/16/13 PFGCO ADMX 63770 L 05/12/13 05/21/13 PFGCO ADMX 63975 L 05/12/13 05/30/13 PFGCO #!/usr/bin/perl # use strict; use warnings; use Date::Calc qw( Delta_Days ); my %hash=(); input_data(1,'out1.txt'); input_data(2,'out2.txt'); #input_data(1,'pcarry.txt'); #input_data(2,'rcarry.txt'); output_data('final.txt'); sub input_data { my ($ix,$filename) = @_; open FILE1, "<", $filename or die "$filename : $!\n"; while ( <FILE1> ) { chomp $_; my ( $key, $le, $date, $company ) = split ',', $_; my $pk = join "\t",$key,$le,$company; push @{$hash{$pk}[$ix]},fmt_ymd($date); } close FILE1; } sub output_data { my $filename = shift; open OUTFILE, ">", $filename or die "$filename : $!\n"; # primary key for my $pk (sort keys %hash){ my ($key,$le,$company) = split "\t",$pk; # get multiple dates # print "$pk\n"; # my @dates = @{$hash{$pk}[1]}; # my @rdates = @{$hash{$pk}[2]}; my @dates = (defined $hash{$pk}[1]) ? @{$hash{$pk}[1]} : (); my @rdates = (defined $hash{$pk}[2]) ? @{$hash{$pk}[2]} : (); # even up number of dates: while (@dates < @rdates) { push @dates,'1900-01-01'; } while (@rdates < @dates) { push @rdates,'1900-01-01'; } # print out multiple dates for each key for my $date (reverse sort @dates){ # use match sub if more than 1 if (@rdates > 1){ @rdates = match($date,@rdates); } # rdates sorted so best match is first element my $rdate = shift @rdates; print join ' ',$key,$le,fmt_mdy($date),fmt_mdy($rdate),$company, +"\n"; } } close OUTFILE; } # match dates by calc days diff # and sorting to get least diff sub match { my ($date,@rdates) = @_; my @days=(); # split date into y,m,d my @d1 = split /\D/,$date; # calc diff and store with date for my $rdate (@rdates){ my @d2 = split /\D/,$rdate; push @days,[$rdate,abs Delta_Days(@d1,@d2)]; } # sort array by days @days = sort {$a->[1] <=> $b->[1]} @days; # extract dates return map {$_->[0]} @days; }

In reply to issue with output of file matching by rruser

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.