Thanks very much for your help John.



----- Original Message -----
From: "John W. Krahn" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, December 22, 2003 2:28 PM
Subject: Re: Read Fix Length Text, Loop Problems


> William Martell wrote:
> >
> > Hello All,
>
> Hello,
>
> > Thanks for reading my email.  I am trying to read a fix length text file
and
> > extract specific substrings from each line.  I would like to extract
> > specific things depending on which line is being read so I can avoid
picking
> > up trash reading every line. The pattern repeats itself over and over
again
> > until completion, so I think I should set a counter and then use the
counter
> > to choose which set to extract, then I will reset the counter again to
> > repeat the process.  I am having trouble understanding how to set the
> > counter and determine what line is being read to extract.
> >
> > Any help or hints would be greatly appreciated.
> >
> > Here is my code.-------------------------------------------#!/perl
> >
> > open (INFILE, "artb30_short.da4") || die "Can't open artb30.da4 file.";
>
> You should include the $! variable in the error message so that you know
why it failed.
>
> > my @order_detail;
> >
> > @data = <INFILE>;
> >
> > foreach $row ( @data ){
>
> From your code it doesn't look like you need to slurp the entire file into
memory.
>
> while ( <INFILE> ) {
>
> >   if( $row == 1 ){
>
> $row contains the contents of the current line, not the line number
>
> >    # extract fields for row 1
> >    my %item1 = (
> >      cust_number  => substr( $line, 0, 6 ),
> >      cust_name => substr( $line, 8, 31 ),
> >      cycle => substr( $line, 40, 5 ),
> >      customer_type => substr( $line, 47, 15 ),
> >      acct_contact => substr( $line, 64, 20 ),
> >      phone => substr( $line, 86, 15 ),
> >      credit_limit => substr( $line, 104 )
> >    );
> >
> >    # trim spaces
> >    while ( my ($key, $value) = each %item1 ) {
> >      $value =~ s/^\s+//; #beginning spaces
> >      $value =~ s/\s+$//; #ending spaces
> >    }
>
> You can simplify that by using values():
>
>    for ( values %item1 ) {
>      s/^\s+//; #beginning spaces
>      s/\s+$//; #ending spaces
>    }
>
> Or just the hash itself:
>
>    for ( %item1 ) {
>      s/^\s+//; #beginning spaces
>      s/\s+$//; #ending spaces
>    }
>
>
> >    # save for later processing
> >    push @order_detail, \%item1;
> >
> > [snip code]
>
>
> Here is one way to do it:
>
>
> my $file = 'artb30_short.da4';
> open INFILE, $file or die "Can't open $file: $!";
>
> my @order_detail;
> while ( <INFILE> ) {
>     last if /^GROUP TOTALS/;
>     s/\s+\Z//;                  # remove all trailing whitespace
>     next unless /\d\.\d\d\Z/;   # only want lines with dollar amounts at
end
>     my %item;
>     if ( length() < 120 ) {     # item 1 lines are shorter
>         @item{ qw/cust_number cust_name cycle customer_type acct_contact
phone credit_limit/ } =
>             map { s/^\s+//; $_ }
>             unpack 'A6 x2 A30 x2 A5 x2 A15 x2 A20 x2 A15 x2 A*', $_;
> # unpack'A' removes trailing whitespace so we need the map{}
> # to remove leading whitespace
>         }
>     elsif ( /^\d/ ) {           # item 2 lines start with a digit
>         @item{ qw/inv_no type inv_date current days_1_30 days_31_60
>                 days_61_90 days_over_90 on_hold unap_cash total_ar/ } =
>             map { s/^\s+//; $_ }
>             unpack 'A6 x A3 x A8' . 'x3 A11' x 8, $_;
>         }
>     else {                      # item 3 lines
>         @item{ qw/cust_totals_current cust_totals_days_1_30
cust_totals_days_31_60
>                 cust_totals_days_61_90 cust_totals_days_over_90
cust_totals_on_hold
>                 cust_totals_unap_cash cust_totals_total_ar/ } =
>             map { s/^\s+//; $_ }
>             unpack 'x19' . 'x3 A11' x 8, $_;
>         }
>     push @order_detail, \%item;
>     }
>
>
>
> 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>
>


-- 
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