in reply to Re: Out of memory and While replacements with excel XLSX application
in thread Out of memory and While replacements with excel XLSX application

Here is a start at refactoring

diff fudge fudge2

diff fudge2 fudge3

diff fudge3 fudge4

diff fudge4 fudge5

diff fudge5 fudge6

diff fudge6 fudge7

--- fudge6 2012-10-08 01:27:35.187500000 -0700 +++ fudge7 2012-10-08 01:40:55.031250000 -0700 @@ -9,7 +9,7 @@ use Win32::OLE::Variant; use Win32::OLE::NLS qw(:LOCALE :DATE); use List::MoreUtils qw(natatime); -use Excel::Writer::XLSX; +#~ use Excel::Writer::XLSX; ############################################################ @@ -69,13 +69,11 @@ my $Tot_Cols = $Sheet->UsedRange->Columns->{'Count'}; #Extract the necessary information from the rows and columns and plac +es them in three arrays @right @legal and @prod - foreach my $row ( 1 .. $Tot_Rows ) { - if( my $firstCol = eval { - $Sheet->Cells( $row, $col )->{'Value'} - } - ){ - if ( $firstCol =~ /^\d{10}$/ ) { + if( my $firstCol = eval { $Sheet->Cells( 1, 1)->{'Value'} + } + and $firstCol =~ /^\d{10}$/ + ) + { push @right, $firstCol; push @legal, $firstCol; push @prod, $firstCol; @@ -83,42 +81,42 @@ ValueTargetCols( $Sheet, [ \@right, \@legal, \@prod, ], - [ $row ], + [ 1 .. $Tot_Rows ], [ qw{ 4 5 } ], ); ValueTargetCols( $Sheet, [ \@legal, ], - [ $row ], + [ 1 .. $Tot_Rows ], [ qw{ 6 } ], ); ValueTargetCols( $Sheet, [ \@right, ], - [ $row ], + [ 1 .. $Tot_Rows ], [ qw{ 7 8 9 } ], ); ValueTargetCols( $Sheet, [ \@right, \@legal, ], - [ $row ], + [ 1 .. $Tot_Rows ], [ qw{ 10 11 } ], ); ValueTargetCols( $Sheet, [ \@prod, \@right, ], - [ $row ], + [ 1 .. $Tot_Rows ], [ qw{ 12 } ], ); ValueTargetCols( $Sheet, [ \@prod ], - [ $row ], + [ 1 .. $Tot_Rows ], [ qw{ 13 14 15 17 18 @@ -130,7 +128,6 @@ } } } - } $Book->Close; }

diff fudge7 fudge8

diff fudge8 fudge9

--- fudge8 2012-10-08 01:47:28.906250000 -0700 +++ fudge9 2012-10-08 01:48:45.046875000 -0700 @@ -55,17 +55,15 @@ print "$workfile\n"; my $Book = $Excel->Workbooks->Open($workfile); -#####Work on each sheet in the workbook -#####This is the number of worksheets in the workbook my $sheetcnt = $Book->Worksheets->Count(); -#~ foreach my $r (1) { +#~ foreach my $r ( 1 .. $sheetcnt ) { { my $Sheet = $Book->Worksheets( 1 ); push @recID, $Sheet->{Name}; print "Worksheet name is $Sheet->{Name}\n"; my $Tot_Rows = $Sheet->UsedRange->Rows->{'Count'}; my $Tot_Cols = $Sheet->UsedRange->Columns->{'Count'}; - my $firstCol = eval { $Sheet->Cells( 1, 1)->{'Value'} } + my $firstCol = eval { $Sheet->Cells( 1, 1)->{'Value'} }; if( defined $firstCol and $firstCol =~ /^\d{10}$/ ) {

diff fudge9 fudge10

I end up with fudge10

Replies are listed 'Best First'.
Re^3: Out of memory and While replacements with excel XLSX application
by Anonymous Monk on Oct 08, 2012 at 09:41 UTC
    ValueTargetCols should loop over rows first then cols, but it probably makes no difference in the results in this case