sillybees has asked for the wisdom of the Perl Monks concerning the following question:

I'm trying to use the logic in my script  that allows me to 
catch a line that differs in time by comparing field2 and 
field3.  I managed to come up with an input file of this 
format for my comparison purpose:

(sample 4 lines:)
n1##Thu Oct 18 14:33:23 2007  ## 2007-10-18 14:33:23.000000000-0400
name2##Thu Feb  5 01:13:19 2009  ##2009-02-05 01:13:19.000000000-0500
name3##Sat Jan 24 10:03:37 2009  ##2009-01-24 10:03:37.000000000-0500
name8##Thu Feb  5 01:13:19 2009    ##2007-03-05 01:13:19.000000000-0500
(... 1000s of similar entries)

I don't care about the day. I'm trying to find if fileld2
 matches with field3 in terms of dd-MM-YYYY HH:MM:SS.  If 
they are not, I would like to print the line.  Can someone 
please help me. I tried my feeble attempt in re-arranging 
the third filed  but it does n't help me.

In the above example, name1/2/3 are good. But name8 entry 
is incorrect in the sense time info on  field2 and field3 
are different. I would like to print out the entry if it's 
possibility.  Please note "##' is my field separator.

Thank you.
Pad

Replies are listed 'Best First'.
Re: how to compare time between 2 fields ?
by Ratazong (Monsignor) on Jun 30, 2010 at 06:00 UTC

    Hi!

    I propose to address this in several steps:

    1. convert both dates to a common internal format you define (e.g. by parsing the line with a regex)
    2. compare the converted dates - possibly using a module like Date::Calc

    Depending on how you will use it, the internal format may be some sort of epoch-number or simply a set of variables like $day1, $day2, $mon1, $mon2 ...

    If the approach above doesn't help you and you are stuck at a specific place, just post your code, so we may give you more hints!

    HTH, Rata

Re: how to compare time between 2 fields ?
by afoken (Chancellor) on Jun 30, 2010 at 03:40 UTC

    There is no name1 line. There is no date in dd-MM-YYYY format.

    Show us your code and a reasonable part of your actual data, both wrapped in <code> tags. Don't put code or data into <pre> tags, and especially don't put your question into <pre> tags, use <p> tags for that.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

      Thank you. I already posted the data inputfile.

      name1##Thu Oct 18 14:33:23 2007 ## 2007-10-18 14:33:23.000000000-0400 name2##Thu Feb 5 01:13:19 2009 ##2009-02-05 01:13:19.000000000-0500 name3##Sat Jan 24 10:03:37 2009 ##2009-01-24 10:03:37.000000000-0500 name8##Thu Feb 5 01:13:19 2009 ##2007-03-05 01:13:19.000000000-050 +0 (... 1000s of similar entries)

      I never tried perlmonks before. Sorry for not using proper tag. In regards to your other question, data format in field2 is different than field3. If these two times are of epoch timeformat, I can compare the strings myself. Because they use different format in field 2 and 3, I don't know how to compare them myself. My perl code may not help here as it was collecting field2 and field3 from two different file for the names in field1.

      Thanks pad

Re: how to compare time between 2 fields ?
by ww (Archbishop) on Jun 30, 2010 at 13:09 UTC
    Rather than attempt to roll your own conversion package, check CPAN for modules in the Date... and Date::xxx families.

    Conversion among datetime formats is fraught with many complications; adopt one of Perl's desiderata: laziness.

Re: how to compare time between 2 fields ?
by Cristoforo (Curate) on Jun 30, 2010 at 16:09 UTC
    A handy module for your problem is Date::Parse.
    #!/usr/bin/perl use strict; use warnings; use Date::Parse; while (<DATA>) { my ($name, $field1, $field2) = split /\s*#+\s*/; print str2time($field1), ' ', str2time(substr($field2,0,19)),"\n"; } __DATA__ n1##Thu Oct 18 14:33:23 2007 ## 2007-10-18 14:33:23.000000000-0400 name2##Thu Feb 5 01:13:19 2009 ##2009-02-05 01:13:19.000000000-0500 name3##Sat Jan 24 10:03:37 2009 ##2009-01-24 10:03:37.000000000-0500 name8##Thu Feb 5 01:13:19 2009 ##2007-03-05 01:13:19.000000000-050 +0
    The output is:
    1192732403 1192732403 1233814399 1233814399 1232809417 1232809417 1233814399 1173075199

      Thank you so much everyone. I plan to go with Cristoforo's solution in my scripting. I'm glad that I came across this forum when I was struggling to come up with a solution.