rruser has asked for the wisdom of the Perl Monks concerning the following question:
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; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: issue with output of file matching
by poj (Abbot) on Jun 07, 2013 at 19:44 UTC | |
by rruser (Acolyte) on Jun 07, 2013 at 20:17 UTC | |
by poj (Abbot) on Jun 07, 2013 at 20:30 UTC | |
by rruser (Acolyte) on Jun 07, 2013 at 21:49 UTC | |
by poj (Abbot) on Jun 08, 2013 at 12:40 UTC | |
| |
|
Re: issue with output of file matching
by JockoHelios (Scribe) on Jun 07, 2013 at 19:29 UTC | |
by rruser (Acolyte) on Jun 07, 2013 at 19:40 UTC |