.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";
답변1
나머지 열을 반복하기 전에 현재 행의 열 0을 확인하는 것이 좋습니다. 값이 세미콜론으로 시작하면 다음 행으로 건너뜁니다.
# ...
for my $row ( 1 .. $row_max ) {
my @data;
next if $worksheet->get_cell($row, 0) =~ /^;/;
# ...
이렇게 하면 새로운(행) 데이터를 배열에 푸시하는 것을 방지할 수 있습니다.
답변2
이 결과를 얻으려면 다음을 사용할 수 있습니다 awk
.
awk '$1 !~ "NUMBER" && $1 !~ "^;" {print $1,$3}' file.xls
NUMBER
이는 해당 문자열을 포함 하거나 로 시작하는 항목을 인쇄하지 않도록 지시합니다 ;
. 그런 다음 첫 번째 및 세 번째 열을 인쇄하고 예상되는 출력을 제공합니다.
one a
two b
three c
five e
six f
eight h