Regex Perl-如何解析.tsv文件中的空值
我正在使用Perl解析一个Excel电子表格,我已将其转换为以制表符分隔的文本文件。 我想编写一个if循环,它取决于某个列中是否存在值,但空值会导致代码失败 以下是tsv文件的外观:Regex Perl-如何解析.tsv文件中的空值,regex,perl,parsing,tsv,Regex,Perl,Parsing,Tsv,我正在使用Perl解析一个Excel电子表格,我已将其转换为以制表符分隔的文本文件。 我想编写一个if循环,它取决于某个列中是否存在值,但空值会导致代码失败 以下是tsv文件的外观: Patient No. Date Freezer Location Description Frozen @ Passage PT101 12/29/09 F1,-130 P-3,68 SERUM
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;
当我运行此命令时,会收到一条错误消息,抱怨未初始化的值混淆了Regex if语句。是否有If语句可用于检查未初始化的值?是否有其他方法可以根据第6列中的值编写if语句
注意:我考虑过使用pop函数来获取最右边的值,并检查该值是否为数字,但这是不可取的,因为在我的示例中,右边有更多的列,这些列有时是数字的,有时是文本的,有时是空白的
是否有if语句可用于检查未初始化的值?是否有其他方法可以根据第6列中的值编写if语句
有很多方法可以做到这一点。可以使用未定义的or运算符//
或者,您可以检查定义:
next unless defined( $p ) && $p =~ /\d/;
如果“0”不是有效的数字字符串,您可以简单地检查错误,如下所示:
next unless $p && $p =~ /\d/;
但是,我想我会尝试向您展示如何使用Text::CSV执行此操作:
请注意,您可以使用适当的CPAN模块直接读取Excel,从而避免转换为CSVDon,而不必为此使用正则表达式。使用Text::CSV或Text::csvxs模块。@Slavatron简单地使用它会更安全。
next unless $p && $p =~ /\d/;
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;
}