in reply to Re^3: Excel and Perl
in thread Excel and Perl

Is there a way to auto generate the "Hash of Arrays" from an excel sheet or would I be required to type them all in individually? The data is very high volume in each excel sheet and manually jotting them down to a program is definitely not an option. Thank you.

Replies are listed 'Best First'.
Re^5: Excel and Perl
by wind (Priest) on Jun 09, 2011 at 01:37 UTC

    Yes, you have all the resources you need to accomplish your goal. Just use Spreadsheet::ParseExcel to parse the spreadsheet, and use the code I demonstrated to process the data.

    You're going to have to do some learning to finish the project, but you have everything you need.

      Would it be alright with you to go into detail as to how your code is crunching the data?, I do not follow it fully esp. with the instance of how my parsed data is being fed into the code. Thank you.
Re^5: Excel and Perl
by Tux (Canon) on Jun 09, 2011 at 06:25 UTC

    Spreadsheet::Read reads whole spreadsheets in a single hash of lists (sheets) of lists (columns) of lists (rows), including meta-information my $ss = ReadData ("file.xls"); using Spreadsheet::ParseExcel (or any other supported spreadsheet parser).

    The first sheet is my $sheet = $ss->[1];.

    The formatted value of cell B3 can be accessed by $sheet->{"B3"}. The unformatted value by $sheet->{cell}[2][3].

    Does that help?


    Enjoy, Have FUN! H.Merijn
      I was a given the following code that was to help with the data crunching.
      my %vals; while (<DATA>){ chomp; my ($key, $val) = split; push @{$vals{$key}}, $val; } for my $key (sort {$a <=> $b} keys %vals) { my $max = max @{$vals{$key}}; print "$key $max\n"; } I figured that , since my hint for a successful functioning of the cod +e included parsing of excel using Spreadsheet::ParseExcel, I went ahe +ad and added the code to the parsing one as such: <code> #!/usr/bin/perl -w use strict; use warnings; use Spreadsheet::ParseExcel; use List::Util qw(max); my $parser = Spreadsheet::ParseExcel->new(); my $workbook = $parser->parse('4_19_10_Zrc01a-2.xls'); if ( !defined $workbook ) { die $parser->error(), ".\n"; } for my $worksheet ( $workbook->worksheets() ) { my ( $row_min, $row_max ) = $worksheet->row_range(); my ( $col_min, $col_max ) = $worksheet->col_range(); for my $row ( $row_min .. $row_max ) { for my $col ( $col_min .. $col_max ) { my $cell = $worksheet->get_cell( $row, $col ); next unless $cell; my %vals; while (<$col eq 5 and $col eq 8>){ chomp; my ($key, $val) = split; push @{$vals{$key}}, $val; } for my $key (sort {$a <=> $b} keys %vals) { my $max = max @{$vals{$key}}; print "$key $max\n"; } + } } }
      I changed the required DATA to the columns that I was specifically interested, which is that of column 5 and 8. For some reason, I have a big time error list when I run it. I must be missing something here. Any help would be appreciated. Thank you.