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]