我有一个三列Excel文件,它具有以下模式
12 A P1 23 B P5 24 C P2 15 D P1 06 E P5
此数据集的基础结构是,
P1
包含A
和D
; A
对应12
,D
对应15
P2
包含C
; C
对应24
P5
包含B
和E
; B
对应23
,E
对应06
我想在散列结构中表示这种结构,即使用P1
作为指向散列的键,A
用作此二级散列的键。有没有办法在Perl中实现这个?
答案 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
中使用的方法同时适用于*.xlsx
和Spreadsheet::XLSX
个文件。
答案 3 :(得分:0)
格式化的文件的格式是什么版本?
我使用模块Spreadsheet::ParseExcel
(Spreadsheet::WriteExcel
输出)来阅读(和写入).xls文件方面有非常好的经验。
不幸的是,我4年前这样做了.xlsx格式并不普遍,所以我不能代表那些。