Hi Paul.

May I pull your code apart?

Paul Kraus wrote:
> I have a variable amount of text files that need to get parsed. The
> files come in groups of 6. I only need to parse files 4 5 and 6. So if I
> had 3 groups waiting to be processed then I would have to read through
> and parse 4,5,6,10,11,12,16,17,18.
>
> The file names look like this...
>
> 6.1.200_(1)_(9443).txt
> Date_element of group_time.txt
>
> So I would processing all of the files for 6.1.
> Also I couldn't figure out a way to sort them easily as you will see me
> in my code so any suggestions there would be helpful also.
>
> How can I setup a loop that will run the correct amount of times and
> only parse these files from the group. Here is my code.
>
>
> #!/usr/bin/perl
>
> use warnings;
> use strict;
> use DBI;
>
> opendir ( DH, "." ) or die ( "Could not open $!\n" );
> my @allfiles = readdir(DH);

You don't need @allfiles. You can do

  foreach ( readdir DH ) {
    :
  }

> my %sales;
> foreach ( @allfiles ) {
>   next unless /^\d+\.\d+\.\d+_/;
>   push (@{$sales{$1}}, $_) if /^(\d+\.\d+\.\d+)_/;
> }

No need to check the filename twice - just

  my %sales;

  foreach ( readdir DH ) {
    push (@{$sales{$1}}, $_) if /^(\d+\.\d+\.\d+)_/;
  }

> foreach (sort keys %sales){
>   my $salesjournals = scalar(@{$sales{$_}});
>   &processdate($sales{$_}, $salesjournals);
>   die;
> }

No need to calculate the array size before the call, and
the & on the subroutine name is a bad idea.

foreach (sort keys %sales){
  processdate($sales{$_});
}

This then needs

  sub processdate {

    my $filenames = shift;
    my $salesjournals = @$filenames;

> sub processdate {
>   my ($filenames, $salesjournals) = ( shift, shift );
>   my (%pel, %cfb, %leimkuehler, @files);
>   foreach ( @ { $filenames } ){
>     push (@files, $1 . "-$_") if /_\((\d+)\)_/;
>   }

Use 'grep' here to pull out the files you want. I assume
they have names _(1)_ upwards?

    my @files = grep { /_\((\d+)\)_/, ($1 - 1) % 6 > 2 } @$filenames;

>   @files = sort {$a <=> $b} @files;
>   foreach (@files){
>     my $tmp = $1 if s/^(\d+)-//;

This can never be true. Your filenames look like /^\d+\./. Will

  /^(\d+)/;
  print "$1 \t $_\n";

do here?

>     if ( $tmp == ){
>       print "$tmp \t $_\n";
>     }
>   }
> }

Anyway, here's the assembled package.

I hope it helps.

Rob



  #!/usr/bin/perl

  use warnings;
  use strict;

  use DBI;

  opendir DH, '.' or die "Could not open directory: $!";

  my %sales;

  foreach ( readdir DH ) {
    push @{$sales{$1}}, $_ if /^(\d+\.\d+\.\d+)_/;
  }

  foreach (sort keys %sales) {
    processdate($sales{$_});
  }

  sub processdate {

    my $filenames = shift;
    my $salesjournals = @$filenames;

    my @files = grep { /_\((\d+)\)_/, ($1 - 1) % 6 > 2 } @$filenames;

    @files = sort {$a <=> $b} @files;

    foreach (@files){
      my ($tmp) = /^(\d+)/;
      print "$tmp \t $_\n";
    }

  }




-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to