使用Perl忽略CSV文件中的空行

时间:2014-01-06 06:01:42

标签: perl csv

我必须阅读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 ,但它没有帮助。

4 个答案:

答案 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;
    ...