从excel文件中提取数据并将它们组织成哈希值

时间:2011-12-21 04:05:12

标签: perl

我有一个三列Excel文件,它具有以下模式

12   A    P1  
23   B    P5
24   C    P2
15   D    P1
06   E    P5

此数据集的基础结构是, P1包含AD; A对应12D对应15 P2包含C; C对应24 P5包含BE; B对应23E对应06

我想在散列结构中表示这种结构,即使用P1作为指向散列的键,A用作此二级散列的键。有没有办法在Perl中实现这个?

4 个答案:

答案 0 :(得分:2)

Spreadsheet::ParseExcel可用于解析.xls个文件。下面是一个构建所需数据结构的示例程序。

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;
use Spreadsheet::ParseExcel;

my $parser    = Spreadsheet::ParseExcel->new;
my $workbook  = $parser->parse( shift or die "Please provide a file\n" );
my $worksheet = $workbook->worksheet(0);

my %data;
for my $row ( 0 .. $worksheet->row_range ) {
    my $value     = $worksheet->get_cell( $row, 0 )->value;
    my $key       = $worksheet->get_cell( $row, 1 )->value;
    my $super_key = $worksheet->get_cell( $row, 2 )->value;
    $data{$super_key}->{$key} = $value;
}

print Dumper \%data;

输出

$VAR1 = {
          'P5' => {
                    'E' => '06',
                    'B' => '23'
                  },
          'P2' => {
                    'C' => '24'
                  },
          'P1' => {
                    'A' => '12',
                    'D' => '15'
                  }
        };

答案 1 :(得分:1)

我过去必须在电子表格中处理数据。如果要处理少量Excel文件,请使用Excel等电子表格软件将其手动导出为CSV文件。然后解析CSV文件,并将单元格值存储在perl中的哈希散列中:

#!/usr/bin/env perl
use warnings;
use strict;

use Data::Dumper::Simple;

my $file = "";
my @row = ();
my $rowidx = 1;
my %hh = (); # hash of hashes

open( INFILE, "input.csv" ) or die("Can not open input file: $!");

while ( $file = <INFILE> ) {
    @row = parse($file);
    chomp(@row);

    $hh{ $row[2] }{ $row[1] } = $row[0];
    #warn Dumper %hh; # debug

    $rowidx++;
}

close(INFILE);

warn Dumper %hh;

exit;

sub parse {
    my @newrow  = ();
    my $columns = shift; # read next row
    push( @newrow, $+ ) while $columns =~ m{"([^\"\\]*(?:\\.[^\"\\]*)*)",?|([^,]+),?|,}gx; # parse and store columns to array 
    push( @newrow, undef ) if substr( $columns, -1, 1 ) eq ',';
    return @newrow;
}

运行此功能

$ more input.csv
12,A,P1
23,B,P5
24,C,P2
15,D,P1
06,E,P5
$ ./ReadCSV.pl input.csv 
%hh = (
    'P5' => {
              'E' => '06',
              'B' => '23'
            },
    'P2' => {
              'C' => '24'
            },
    'P1' => {
              'A' => '12',
              'D' => '15'
            }
  );

答案 2 :(得分:1)

Spreadsheet::ParseExcel函数可以很好地解析常规*.xls电子表格。

幸运的是,有一个名为Spreadsheet::XLSX扩展程序可与Spreadsheet::ParseExcel一起使用,也可以阅读*.xlsx个电子表格。如果您还安装了Spreadsheet::ParseExcel,则*.xls中使用的方法同时适用于*.xlsxSpreadsheet::XLSX个文件。

答案 3 :(得分:0)

格式化的文件的格式是什么版本?
我使用模块Spreadsheet::ParseExcelSpreadsheet::WriteExcel输出)来阅读(和写入).xls文件方面有非常好的经验。

不幸的是,我4年前这样做了.xlsx格式并不普遍,所以我不能代表那些。