【发布时间】:2013-10-20 16:26:48
【问题描述】:
我正在尝试使用Text::CSV Perl 模块来解析制表符分隔的文件。
我要解析的文件是:
#IGNORE COLUMN1 COLUMN2 COLUMN3 COLUMN4
ROW1 x y z a
ROW2 b c d
ROW3 w
请注意,文件是制表符分隔的。该文件可能有N 列和N 行。此外,在ROW2 的情况下,它有第四个选项卡但没有值。在COLUMN1 的w 值之后,ROW3 没有制表符。 IE。某些列可能有未定义的值或空白值。
到目前为止,我已经开始编写 Perl 脚本,但很早就开始尝试弄清楚如何编写代码来回答以下问题:
找出有多少ROWn。然后为每个COLUMNn 检查我是否有ROWn 值。所以在这种情况下,COLUMN2、COLUMN3 和 COLUMN4 将有缺失值。
任何提示和指导都会有所帮助(我是 Perl 新手)。我查看了 CPAN Text::CSV 页面,但我无法解决这个问题。
#!/usr/bin/perl
use warnings;
use strict;
use v5.12;
use Text::CSV;
my $csv = Text::CSV->new ({
escape_char => '"',
sep_char => '\t',
eol => $\,
binary => 1,
blank_is_undef => 1,
empty_is_undef => 1,
});
open (my $file, "<", "tabfile.txt") or die "cannot open: $!";
while (my $row = $csv->getline ($file)) {
say @$row[0];
}
close($file);
【问题讨论】:
-
如果您可以同时拥有空白字段(一行中的多个选项卡)和不存在的字段(行提前结束),您会将空白字段视为不存在吗?
-
@TLP 是的。基本上,一行可能有多个值为“空白”的选项卡(例如,
ROW2、COLUMN4有一个“空”选项卡值,或者该行可能会像在没有字符的ROW3中那样提前结束在COLUMN1中的w之后 -
使用
sep_char => "\t"as'\t'使分隔符按字面意思\t而不是制表符。 -
@user2402135 那么你有什么问题呢?那你不知道
$row的元素怎么算?那你不知道怎么比较空和未定义? -
@TLP 看过 Text::CSV CPAN 页面后,我无法访问每一行 x 列引用,以便能够比较空和未定义或能够计算元素在行中。如果我可以找到/访问构成我的制表符分隔表的“元素”,那么我可以轻松地继续 :)