Perl - 如何解析.tsv文件中的空值

时间:2014-10-15 19:09:42

标签: regex perl parsing tsv

我正在使用Perl来解析我已转换为制表符分隔文本文件的Excel电子表格。 我想写一个 if 循环,它取决于某个列中是否存在值,但是null值会导致我的代码失败。

这是tsv文件的样子:

Patient No.     Date      Freezer   Location        Description     Frozen @ Passage
PT101           12/29/09  F1,-130   P-3,68          SERUM                                   
PT101           2/16/10   F1,-130   Q-9,62          Omentum         4                                       
PT101           2/16/10   F1,-130   Q-9,63          Omentum         4                                       
PT101                     F1,-130   O-3,8           L Ovary Tumor                                   

请注意,某些行包含空单元格

以下是代码:

#!/usr/bin/perl
use strict;
use warnings;
my $file = shift @ARGV;
open( FILE, $file );
while (<FILE>) {
    my $line = $_;
    chomp $line;
    my @c = split( "\t", $line );
    my $p = $c[5];
    if ( $p !~ /\d/ ) { next; }    # this value will be a number if it is present
    print "$line\n";
}
close FILE;

当我运行这个时,我收到一条错误消息抱怨混淆了正则表达式if语句的未启动值。如果有 if 语句可用于检查未启动的值?是否有其他方法可以编写基于第6列中是否存在值的 if 语句?

注意:我考虑过使用 pop 函数来获取最右边的值并检查该值是否为数字,但这是不受欢迎的,因为在我的示例中右侧有更多列有时是数字的,有时是文本的,有时是空白的。

1 个答案:

答案 0 :(得分:0)

  

我有一个if语句可以用来检查未启动的值吗?是否有其他方法可以编写基于第6列中是否存在值的if语句?

有很多方法可以做到这一点。您可以使用“undefined-or”运算符(//

next unless ( $p // '' ) =~ /\d/;

或者您可以检查定义:

next unless defined( $p ) && $p =~ /\d/;

如果不是'0'是有效数字字符串的情况,你可以简单地检查“虚假”,如下所示:

next unless $p && $p =~ /\d/;

但是,我想我会尝试向您展示如何使用Text::CSV

执行此操作
my $csv = Text::CSV->new ({ sep_char => "\t" });    
while ( my $line = <FILE> ) {
    chomp $line;
    next unless $line;
    die $csv->error_diag 
        unless $csv->parse( $line )
        ;
    next unless defined( my $p = ( $csv->fields )[5] );
    next unless $p =~ /\d/;
    say $line;
}