2011-11-28 90 views
1

我正在使用Excel工作表来获取两列并根据它们替换文件名。使用电子表格:: ParseExcel

这就是我如何得到我感兴趣的两列的值。第14列可以是单个值或多个逗号分隔的列。

my @required = (2,14); 
my @value; 
my @files = grep{ -f && -T && -M > 0 } glob("$dir/*"); 
my @expected_file = grep{ /Parsed/ } @files; 
print "@expected_file\n"; 
if(! $workbook) { 

    die $parser->error(),"\n"; 
} 


for my $row (1 .. $row_max) { 

    @value = map{ 


     my $cell = $worksheets[0]->get_cell($row,$_); 
     $cell ? $cell->value() : ''; 

    }@required; 

    my %hash_value = @value; 
    foreach my $key (keys %hash_value){ 

     my @suffix = split /[, ]/,$hash_value{$key}; 

     push @{ $resample->{$key} },@suffix; 


     print $key . ":" [email protected],"\n"; 
    } 

} 

输出将是:

TY45745a:A,BTY45745a:C,DTY45745a:E,FTY5475a:G,HTY5475a:I,JTY5475a:K,L 

凡TY45745a,TY5475a是我想达到keys.What是这样的:TY45745a A,B,C,d,E,F和TY5475a G,H,I,J,K,L。

如果文件名后面有[A-E],那么它应该重命名为TY45745a [1..6],如果它有[G-L] TY5475a [1..6]。

从Excel工作表读取时,是否可以完成名称的后缀分组?

我该怎么做?任何建议或指针都会有所帮助。

+2

这个问题实际上与Spreadsheet :: ParseExcel没有任何关系。您似乎只需要将您正在读取的数据从一种格式转换为另一种格式。如果你只是用你想要实现的翻译来表达这个问题,而忽略所有的Excel代码,那可能会更好。 – jmcnamara

+1

如果您希望其他人能够真正尝试运行您的脚本以帮助您*,请不要在代码清单中包含行号。 –

回答

1

我假设你的表如下所示:

| B (2) | N (14) | 
|:--------:|:-------:| 
| TY45745a | A,B  | 
| TY45745a | C,D  | 
| TY45745a | E,F  | 
| TY5475a | G,H  | 
| TY5475a | I,J  | 
| TY5475a | K,L  | 

你可以做的第一部分

凡TY45745a,TY5475a是我想达到keys.What是这样的:TY45745a A,B,C,D,E,F和TY5475a G,H,I,J,K,L。

用下面的代码:

use strict; 
use warnings; 
use Spreadsheet::ParseExcel; 
use Data::Dumper; 

my $parser = Spreadsheet::ParseExcel->new(); 
my $book = $parser->Parse('Mappe1.xls') or die $parser->error(),"\n"; 
my $sheet = $book->{Worksheet}; 

my %hash; 
for my $row (0 .. $sheet->[0]{MaxRow}) { 

    my $c2 = $sheet->[0]->get_cell($row, 2-1); 
    my $key = $c2 ? $c2->value() : ''; 

    my $c14 = $sheet->[0]->get_cell($row, 14-1); 
    my @values = $c14 ? split(',', $c14->value()) :(); 

    push @{$hash{$key}}, @values; 
} 

print Dumper \%hash; 

我加入了缺失的部分,以获取代码运行,简化了一点 位用于演示目的。