我是Perl的新手.我有excel文件说"sample.xls",如下所示. Sample.xls
有大约这样的1000行数据.我想解析这个文件并将其写在另一个文件中,如下所示输出格式为"output.xls".
output.xls 我在perl中编写了一个脚本,然而,它并没有按照我想要的方式给出确切的输出.此外,看起来脚本效率不高.任何人都可以指导我如何改进我的脚本以及输出如"output.xls"所示?
这是脚本:
#!/usr/bin/perl –w
use strict;
use warnings;
use Spreadsheet::ParseExcel;
use Spreadsheet::WriteExcel;
use Spreadsheet::WriteExcel::Chart;
# Read the input and output filenames.
my $inputfile = "path/sample.xls";
my $outputfile = "path/output.xls";
if ( !$inputfile || !$outputfile ) {
die( "Couldn't find file\n" );
}
my $parser = Spreadsheet::ParseExcel->new();
my $inwb = $parser->parse( $inputfile );
if ( !defined $inwb ) {
die "Parsing error: ", $parser->error(), ".\n";
}
my $outwb = Spreadsheet::WriteExcel->new( $outputfile );
my $inws = $inwb->worksheet( "Sheet1" );
my $outws = $outwb->add_worksheet("Sheet1");
my $out_row = 0;
my ( $row_min, $row_max ) = $inws->row_range();
my ( $col_min, $col_max ) = $inws->col_range();
my $format = $outwb->add_format(
center_across => 1,
bold => 1,
size => 10,
border => 4,
color => 'black',
border_color => 'black',
align => 'vcenter',
);
$outws->write(0,0, "Item Name", $format);
$outws->write(0,1, "Spec", $format);
$outws->write(0,2, "First name", $format);
$outws->write(0,3, "Middle Name", $format);
$outws->write(0,4, "Last Name", $format);
$outws->write(0,5, "Customer Number", $format);
$outws->write(0,6, "Age", $format);
$outws->write(0,7, "Units", $format);
my $col_count = 1;
#$row_min = 1;
for my $inws ( $inwb->worksheets() ) {
my ( $row_min, $row_max ) = $inws->row_range();
my ( $col_min, $col_max ) = $inws->col_range();
for my $in_row ( 2 .. $row_max ) {
for my $col ( 0 .. 0 ) {
my $cell = $inws->get_cell( $in_row, $col);
my @fields = split /_/, $cell->value();
next unless $cell;
$outws->write($in_row,$col, $cell->value());
$outws->write($in_row,$col+1, $fields[1]);
}
}
for my $in_row ( 2 .. $row_max ) {
for my $col ( 1 .. 1 ) {
my $cell = $inws->get_cell( $in_row, $col);
my @fields = split /_/, $cell->value();
next unless $cell;
#$outws->write($in_row,$col+1, $cell->value());
$outws->write($in_row,$col+1, $fields[0]);
$outws->write($in_row,$col+2, $fields[1]);
$outws->write($in_row,$col+3, $fields[2]);
$outws->write($in_row,$col+4, $fields[3]);
}
}
for my $in_row ( 2 .. $row_max ) {
for my $col ( 2 .. 2 ) {
my $cell = $inws->get_cell( $in_row, $col);
my @fields = split /_/, $cell->value();
next unless $cell;
$outws->write($in_row,6, $cell->value());
}
}
for my $in_row ( 2 .. $row_max ) {
for my $col ( 3 .. 9 ) {
my $cell = $inws->get_cell( $in_row, $col);
next unless $cell;
}
}
for my $in_row ( 2 .. $row_max ) {
for my $col ( 10 .. 10 ) {
my $cell = $inws->get_cell( $in_row, $col );
next unless $cell;
$outws->write($in_row,7, $cell->value());
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了对输出进行排序,您需要在写出之前先收集所有信息。现在,您正在行和列之间来回跳跃。
以下是我要进行的一些更改,以对其进行排序,并使其更有效(阅读)。
$data
来存储所有信息。在该循环内,使用必须解析各个字段的代码来解析它们。没有2..2
循环。只是一堆声明。
my @item_fields = split /_/, $inws->get_cell( $in_row, 0 ) || q{};
my @name_fields = split /_/, $inws->get_cell( $in_row, $col ) || q{};
Run Code Online (Sandbox Code Playgroud)将它们存储在$data
每个项目中。
push @{ $data } = [ $item_fields[0], ... ];
Run Code Online (Sandbox Code Playgroud)循环完成。打开输出文件。
$data
使用 a循环sort
并写入输出文件。
foreach my $row (sort { $a->[0] cmp $b->[0] } @{ $data } ) { ... }
Run Code Online (Sandbox Code Playgroud)完毕。
我建议您继续阅读sort
并查看perlref和perlreftut以了解有关引用(数据结构)的更多信息。