我有一个制表符分隔的文本文件。我逐行和逐列阅读。我在每列中进行了一些更改,并将该行写入新文件。当我使用perl的分割函数读取每列时
my @aLastOldElements = split(/\t/, $_);
我最后错过了空柱。例如,如果文件有33个制表符分隔的列,其中10个最后为空。 split函数创建大小为23的数组。我想拥有所有列。因为这样文件的标题(33列)与数据(23列)不匹配,并且在将文件写入数据库时出现错误。
答案 0 :(得分:4)
split
接受可选的第三个参数,以获取要返回的最大字段数。如果存在,则不会丢弃空的尾随字段:
perl -E '@arr = split(/ /, "foo bar ", 100); say scalar @arr'
14
只要存在用于分隔行末尾的空字段的制表符,即使最后10个字段为空,也应始终在数组中提供33个字段。 (在我的示例中,返回了14个字段,因为该字符串包含13个分隔符,即使指定的限制为100。)
修改:回答第一条评论中的问题:
perl -wE '@arr = split(/\t/, "foo\tbar\t\thello\t", 100); say $_ || "(empty field)" for @arr'
foo
bar
(empty field)
hello
(empty field)
答案 1 :(得分:1)
如果您知道列应该在那里,无论它们是否有任何数据,您都可以自己确保结果。
my @aLastOldElements = split(/\t/, $_);
my $short_fall = 33 - @aLastOldElements;
if ( $short_fall > 0 ) {
push @aLastOldElements => ( '' ) x $short_fall;
}