Would this work?  It is a little more discriminating on the year matches.
Person 8 and 5 are deliberate errors in the data format.
It is hoped the verbose still is more clear.

#!/usr/bin/perl
use strict;
use warnings;
my $MonthPattern = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)";
my ($day, $month, $year);
my ($name, $date );
my $condition;
while (my $line = <DATA>) {
    chomp $line;
    ($name, $date ) = split(/:/, $line);
    $condition = 0;
        $day = "";
        $month = "";
        $year = "";

        if (defined $date)
        {
                # Date Pattern 1: 1 AUG 1923 or 15 aPr 95
                if ($date =~ m/^(\d\d?)\s+$MonthPattern\s+(\d{1,4})$/i)
                {
                        $day = $1;
                        $month = uc $2;
                        $year = $3;
                };
                # Date Pattern 2: AUG 1923 or juN 95
                if ($date =~ m/^$MonthPattern\s+(\d{1,4})$/i)
                {
                        $month = uc $1;
                        $year = $2;
                        $condition = 1;
                };
                # Date Pattern 3: 1923 or  9
                if ($date =~ m/^(\d{1,4})$/i)
                {
                        $year = $1;
                };

                # what should the condition be?
                if ($condition) {
                        print "ERROR: For $name the date, [$date], has month
and year but no day: $date\n";
                }
                else
                {
                        print "$name transforms, [$date], to ($day $month
$year)\n"
                }
        }
}
__DATA__
Person1:FEB 1978
Person2:1 APR 1917
Person3:JUL 1973
Person4:24 MAR 1964
Person5:ZZZ 1973
Person6:15 aPr 95
Person7:5 Jul 1995
Person8:15 June 1995
Person9:15 Jun 9
PersonA:15 Sep 999
PersonB:1999

-----Original Message-----
From: Philip Durbin [mailto:philipdur...@gmail.com] 
Sent: Wednesday, March 25, 2009 9:30 PM
To: Stephen Woodbridge
Cc: List - Gedcom
Subject: Re: detecting GEDCOM dates with a year and a month but no day

Yes, that works just fine.  Thanks!

Phil

On Mar 25, 2009, at 11:09 PM, Stephen Woodbridge wrote:

> This should work for the formats you show.
>
> if ($date =~ m/^\s*(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC) 
> \s+(\d+)\s*$/i) {
>    print "ERROR: date has month($1) and year($2) but no day: $date\n";
> }
>
> -Steve
>
> Philip Durbin wrote:
>> I'd like to detect when a date in my GEDCOM file contains a year  
>> and a month but no day, such as "FEB 1978".
>> I've written a small test (below) that you can run with "prove  
>> datebug.t".  The answer I'm looking for is the proper $condition  
>> for the if statement in datebug.pl (also below).
>> Gedcom::Date says "the Gedcom standard for genealogical data files  
>> defines a number of date formats" so it would be nice if the  
>> solution would work not just for the format my dates happen to use  
>> (i.e. 24 MAR 1964, which is what GRAMPS exported), but for any  
>> GEDCOM dates.  That said, I would (selfishly) be content with a  
>> solution that only works for dates like mine. :)
>> Thank you very much for your help!
>> Phil
>> [pdur...@macbook tmp]$ cat datebug.pl
>> #!/usr/bin/perl
>> use strict;
>> use warnings;
>> while (my $line = <DATA>) {
>>    chomp $line;
>>    my ($name, $date ) = split(/:/, $line);
>>    # what should the condition be?
>>    my $condition;
>>    if ($condition) {
>>        print "ERROR: date has month and year but no day: $date\n";
>>    }
>> }
>> __DATA__
>> Person1:FEB 1978
>> Person2:1 APR 1917
>> Person3:JUL 1973
>> Person4:24 MAR 1964
>> [pdur...@macbook tmp]$
>> [pdur...@macbook tmp]$ cat datebug.t
>> use strict;
>> use warnings;
>> use Test::More tests => 1;
>> is(
>>  `./datebug.pl`,
>> "ERROR: date has month and year but no day: FEB 1978
>> ERROR: date has month and year but no day: JUL 1973\n",
>>  'datebug.pl is ok'
>> );
>> [pdur...@macbook tmp]$
>


Reply via email to