【发布时间】:2019-04-25 09:23:18
【问题描述】:
我有一个从 .xls 文件中提取的 perl 代码。我的 .xls 文件如下
NUMBER NAME ALPHABET
one Jane a
two Adam b
three Josh c
;four
five Agnes e
six Mary f
;seven
eight Lara h
我想提取信息,只取第 1 列和第 2 列。我的 perl 代码如下。
#!/usr/bin/perl
use warnings;
use strict;
use Spreadsheet::ParseExcel;
main ();
sub main {
my $filename = 'Book1.xls';
my $parser = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse( $filename );
if ( !defined $workbook ) {
die "-E-: cannot parse <$filename>.\n ", $parser->error(), ".\n";
}
my $worksheet = $workbook -> Worksheet ( 'a' ) || die "-E-: cannot parse family pin list.\n";
my ( $row_min, $row_max ) = $worksheet-> row_range();
open ( my $file,"> output.txt");
for my $row ( 1 .. $row_max ) {
my @data;
for my $col ( 0 ) {
my $number = $worksheet-> get_cell( $row, $col );
if ( $number ) {
push @data, $number-> value();
}
else {
push @data, '';
}
}
for my $col ( 2 ) {
my $alphabet = $worksheet->get_cell( $row, $col );
if ( $alphabet ) {
push @data, $alphabet->value();
print $file "@data\n";
}
else {
push @data, '';
}
}
}
close $file;
print "done\n";
}
结果是
one a
two b
three c
;four
five e
six f
;seven
eight h
我想删除以字符串“;”开头的整个数组。我像下面这样扩展我的代码
open ( my $file,"> output.txt");
for my $row ( 1 .. $row_max ) {
my @data;
for my $col ( 0 ) {
my $number = $worksheet-> get_cell( $row, $col );
if ( $number ) {
push @data, $number-> value();
}
else {
push @data, '';
}
}
for my $col ( 11 ) {
my $alphabet = $worksheet->get_cell( $row, $col );
if ( $alphabet ) {
push @data, $alphabet->value();
}
else {
push @data, '';
}
}
my @new_data = grep(!/;/, @data);
my @latest_data = grep ( $_ ne '', @new_data);
print $file "@latest_data\n";
}
close $file;
print "done\n";
}
输出结果如下所示。
one a
two b
three c
five e
six f
eight h
我不想成为空白。我想如何消除产生如下结果的空白空间?
one a
two b
three c
five e
six f
eight h
我也尝试这样做,但结果是一样的。
for my $index (reverse 0..$#data) {
if ( $data[$index] =~ /^;/ ) {
splice(@data, $index, 1);
}
}
print $file "@data\n";
【问题讨论】:
-
请记住,空字符串(零长度)和空白字符串(都是空格类型的字符)是两个不同的东西。测试
/\S+/以查找包含内容的字符串。 -
如果你不想在你的数组中有空字符串,你为什么要把它们放在那里?删除两个
else { push @data, '' }子句,看看数据是否对您更有用。 -
“输出结果”不清楚——如何在六到七之间得到一个空行?输入中这两行之间没有任何内容。
-
-
"之间有元素" --- 不,不在六和七之间,没有。
标签: perl