in reply to Re: Date::Calc and comparing across arrays?
in thread Date::Calc and comparing across arrays?

Understood

This is what I have so far...

#!/usr/bin/perl use strict; use warnings; use Text::CSV; use Date::Calc qw(:all); use Date::Calendar; #------------------------------------------- # #------------------------------------------- #--------------------------------------- # Edit Custom Variables Below #--------------------------------------- #-------------------------------- # Input and Output files #-------------------------------- #IN is the directory/filename.csv that the input csv is being written +to #OUT is the directory/filename.csv that the output csv #my $in = '/opt/data/input.csv'; #my $out = '/opt/data/output.csv'; my $in = 'c:/Users/cottenr/test.csv'; my $out = 'c:/Users/cottenr/foo.csv'; my $employee_number; my $employee_id; my $start_date; my $end_date; my $total_days; #--------------------------------------- # Program and Loop Section #--------------------------------------- #Looking for csv file to be written #START: while ( -e $in){ my $csv = Text::CSV->new ({ binary => 1, auto_diag => 1, sep_char => ',' # not really needed as this is the default }); #Open IN and OUT files open(my $data, '<:encoding(utf8)', $in) or die "Could not open '$in' f +ile \n"; <$data>; #skips header line of .csv file open(OUT, '>encoding(utf8)', $out) or die "Could not open '$out' file\ +n"; #Loop through the file and process data while (my $fields = $csv->getline( $data )) { $employee_number = $fields->[2]; $employee_id = $fields->[4]; $start_date = $fields->[17]; $end_date = $fields->[18]; $total_days = $fields->[21]; #Conditional eval for Date Comparison if($end_date > $highnumber) { } elsif ($count > $mednumber) { } else { } #Layout the format and write to OUT file print OUT "$employee_number, $employee_id, $start_date, $end_date, $to +tal_days\n"; } #While loop if (not $csv->eof) { $csv->error_diag(); } #--------------------------------------- # Finish it up! #--------------------------------------- #Print out the footer #Close the IN and OUT files close $data; close $in; close OUT; #Delete the INPUT csv file #unlink $in; } #--------------------------------------- # Take a Nap and do it all over again #--------------------------------------- #sleep 60; #goto START;

Not sure how to go about pulling the first line of the Array and then searching for other matches to see if the Start date -2days of line 2 is the enddate of line 1. If it matches then add total time and update my enddate on the OUT.

Thanks, Ray

Replies are listed 'Best First'.
Re^3: Date::Calc and comparing across arrays?
by hdb (Monsignor) on Apr 10, 2013 at 08:18 UTC

    Hope this is helpful!

    use strict; use warnings; use Date::Calendar::Profiles qw( $Profiles ); use Date::Calendar; sub to_date { my ($d,$m,$y) = split /\//, shift; return [$y,$m,$d]; } sub from_date { my $date = shift; $date =~ s/(\d{4})(\d{2})(\d{2})/$3\/$2\/$1/; return $date; } my $calendar = Date::Calendar->new( $Profiles->{'DE-SN'} ); # first read in the whole file and # record start and end dates for each employee my %dates; # simplified data reading, pls stick to Text::CSV while (<DATA>) { next if /^empl/; chomp; my( $employee_id,$start_date,$end_date,$total_days) = split /, +/; $dates{$employee_id}{$start_date}{'end'} = $end_date; $dates{$employee_id}{$start_date}{'days'} = $total_days; } # now we have all the data # and can process it for my $employid (sort keys %dates) { my $data = $dates{$employid}; for my $startdate (keys %{$data}) { my $enddate = $$data{$startdate}{'end'}; next if $enddate eq 'invalid'; # redundant, see below # find next businessday my $next = from_date( $calendar->add_delta_workdays(to +_date($enddate),1) ); # do we have a record for the next business day ? if( exists $$data{$next} ) { # merge two records $$data{$startdate}{'end'} = $$data{$next}{'end +'}; $$data{$startdate}{'days'} += $$data{$next}{'d +ays'}; $$data{$next}{'end'} = 'invalid'; # mark redun +dant } } } for my $employid (sort keys %dates) { my $data = $dates{$employid}; for my $startdate (keys %{$data}) { my $enddate = $$data{$startdate}{'end'}; next if $enddate eq 'invalid'; print "$employid,$startdate,$enddate,"; print $$data{$startdate}{'days'},"\n"; } } __DATA__ employid, start, stop, total 1234,01/04/2013,05/04/2013,5 1234,08/04/2013,12/04/2013,5 1234,18/04/2013,18/04/2013,1 1234,22/04/2013,22/04/2013,1 1234,23/04/2013,23/04/2013,1 5678,01/01/2013,01/01/2013,1

      Wow! thanks for the post... I wasn't expecting someone to write the whole code for me :).

      It is going to take me a bit to work through this but I think this will get exactly what I need.

      I will post my final codes once I get it all worked out. Thanks again! Ray