Stuart Clemons wrote:
> 
> Hi all:
> 
> This newbie is back looking for some hints on how to handle this problem
> in processing a file that has multiline records that look something like
> this:
> 
> Name:  Joe Blow
> DataField1:  xxxxx
> DateField1: 07/07/77
> DataField2: xxxxx
> DateField2: 12/07/03
> 
> Name:  Fi Doe
> DataField1:  xxxxx
> DateField1: 08/08/88
> DataField2: xxxxx
> DateField2: 12/12/03
> 
> etc.
> 
> There is an empty line that separates each record.   I need to extract the
> records that meet certain criteria.   I would really like to know how to
> do this in Perl.
> (For a simple task like this, in the past, I would just import these
> records into a database and write a query to extract the records that I
> wanted.)
> 
> I've actually thought a lot about the problem, but I haven't done any perl
> coding that would allow me to put my woeful perl ineptitude on public
> display in this forum.   I hope to find the time to start on this problem
> in the next couple of days.  As I'm certain to run into problems, I will
> then share my ineptitude while looking for proper guidance from the valued
> learned ones.
> 
> Until then, here's what I was thinking to do.  What I thought I would do
> is try to read each line of one record into an array or hash, then use a
> conditional to determine if that record meets the desired criteria.  If it
> meets the criteria, write out this record to another  file and then read
> in the next record.  If the record doesn't meet the criteria, read in the
> next  record.  I would keep doing this until EOF.
> 
> I think I can handle the conditional stuff, but what I don't know how to
> do is read in each line of the record and stop reading when I hit the
> empty line so that I can do the conditional stuff.
> 
> Is this a valid approach to take for this problem?  And if so, should I
> use an array or hash ?   And again, how do I stop reading the input file
> when I hit the empty line so that I can do the conditional stuff ?
> 
> Thanks in advance for any help and/or hints.  The feedback from my last
> question was extremely helpful as I struggle to get Perl to do what I want
> it to do. I think I'm making progress, although it doesn't always feel
> that way !

When you have an empty line between "records" think "paragraphs" and use
perl's built-in paragraph mode for the input record separator.  If you
are just outputing records that match a certain criteria there is no
need to use an array or hash, just print the records that match.

open IN, '<', 'original' or die "Cannot open 'original': $!";
open OUT, '>', 'newfile' or die "Cannot open 'newfile': $!";

$/ = '';  # set paragraph mode on input record separator

while ( <IN> ) {
    my ($date) = /^DateField1:\s*(.+)/m;
    print OUT if $date eq '08/08/88';
    }

__END__


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