John Fitzgerald wrote:
> 
> Hi,

Hello,

> I'm fairly new to Perl, and trying to do a simple
> operation on a text file exported from excel.
> ID      Enrolled     Extraneous Columns....
> 3008    05-Aug-03
> 3008    05-Aug-03
> 3008    05-Aug-03
> 3008    05-Aug-03
> 3008    24-Sep-03
> 3009    11-Aug-03
> 3010    19-Nov-03
> 3010    11-Jul-03
> 3010    11-Jul-03
> 3010    11-Jul-03
> 3011    15-Jul-03
> As you can see, the dates for a given ID are
> different. What I need to do, is set the dates all to
> the earliest date for that ID (client-birth date). The
> other columns are are important, but don't factor in
> here. I'd appreciate any help. Thanks -John

In order to compare the dates you need to rearrange the fields to a more
comparable format like YYYYMMDD.

my %mons = qw(
    Jan 01 Feb 02 Mar 03 Apr 04 May 05 Jun 06
    Jul 07 Aug 08 Sep 09 Oct 10 Nov 11 Dec 12
    );
my $mons = join '|', keys %mons;

# convert dd-Mmm-yy to yyyymmdd 
sub conv_date {
    my ( $day, $mon, $yr ) = @_;
    # convert '51' to '1951' and '50' to '2050'
    # adjust to taste
    $yr = ( $yr > 50 ? 19 : 20 ) . $yr;
    return "$yr$mons{$mon}$day";
    }

my ( %record, $id );
while ( <DATA> ) {
    ( $id, my ( $old_date, @date ) ) =
        /^(\d+)\s+((\d+)-($mons)-(\d+))/
            or do { print; next };
    if ( not exists $record{ $id } or eof DATA ) {
        for my $key ( keys %record ) {
            for my $line ( @{ $record{ $key }{ lines } } ) {
                $line =~ s/\d+-(?:$mons)-\d+/$record{$key}{date}/;
                print $line;
                }
            }
        %record = (
            $id => {
                date  => $old_date,
                comp  => conv_date( @date ),
                lines => [ $_ ],
                }
            );
        }
    else {
        my $comp = conv_date @date;
        if ( $comp lt $record{ $id }{ comp } ) {
            $record{ $id }{ comp } = $comp;
            $record{ $id }{ date } = $old_date;
            }
        push @{ $record{ $id }{ lines } }, $_;
        }
    }

__DATA__
ID      Enrolled     Extraneous Columns....
3008    05-Aug-03    Extraneous Columns....
3008    05-Aug-03    Extraneous Columns....
3008    05-Aug-03    Extraneous Columns....
3008    05-Aug-03    Extraneous Columns....
3008    24-Sep-03    Extraneous Columns....
3009    11-Aug-03    Extraneous Columns....
3010    19-Nov-03    Extraneous Columns....
3010    11-Jul-03    Extraneous Columns....
3010    11-Jul-03    Extraneous Columns....
3010    11-Jul-03    Extraneous Columns....
3011    15-Jul-03    Extraneous Columns....



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to