我必须阅读CSV文件abc.csv
,从中选择一些字段并形成新的CSV文件def.csv
。
以下是我的代码。我试图忽略来自abc.csv
的空行。
genNewCsv();
sub genNewCsv {
my $csv = Text::CSV->new();
my $aCsv = "abc.csv"
my $mCsv = "def.csv";
my $fh = FileHandle->new( $aCsv, "r" );
my $nf = FileHandle->new( $mCsv, "w" );
$csv->print( $nf, [ "id", "flops""ub" ] );
while ( my $row = $csv->getline($fh) ) {
my $id = $row->[0];
my $flops = $row->[2];
next if ( $id =~ /^\s+$/ ); #Ignore empty lines
my $ub = "TRUE";
$csv->print( $nf, [ $id, $flops, $ub ] );
}
$nf->close();
$fh->close();
}
但是我收到以下错误:
在模式匹配(m //)
中使用未初始化的值$ flops
如何忽略CSV文件中的空行?
我使用了Stack Overflow问题 Remove empty lines and space with Perl ,但它没有帮助。
答案 0 :(得分:1)
如果任何字段为空,您可以跳过整行:
unless(defined($id) && defined($flop) && defined($ub)){
next;
}
您测试了$ id是否为空,但不是$ flops,这就是您收到错误的原因。
你也应该能够做到
unless($id && $flop && $ub){
next;
}
在那里,空字符串将评估为false。
编辑:现在我想到了,你是什么意思忽略不存在的行?
你也可以这样做
my $id = $row[0] || 'No Val' #Where no value is anything you want to signify it was empty
如果第一个值评估为false,则会显示变量的默认值。
答案 1 :(得分:1)
您可以使用List::MoreUtils检查是否定义了任何字段:
use List::MoreUtils qw(any);
while(my $row = ...) {
next unless any { defined } @{ $row };
...
}
答案 2 :(得分:0)
首先在您的文件上运行此操作以获取非空行
sub removeblanks {
my @lines = ();
while(@_) {
push @lines, $_ unless( $_ =~ /^\s*$/ ); #add any other conditions here
}
return \@lines;
}
答案 3 :(得分:0)
您可以执行以下操作以跳过空行:
while (my $row = $csv->getline($fh)){
next unless grep $_, @$row;
...