我有一個製表符分隔的文本文件。我逐行閱讀,逐欄閱讀。我在每列中做了少許更改,並將該行寫入新文件。當我用perl基於標籤的拆分行錯過空列 - Perl
my @aLastOldElements = split(/\t/, $_);
我錯過到底空列的分割功能來讀取每列。例如,如果文件有33個製表符分隔的列,最後10個列是空的。分割函數創建大小爲23的數組。我想擁有所有的列。因爲這樣文件的標題(33列)與數據(23列)不匹配,並且在將文件寫入數據庫時出現錯誤。
我有一個製表符分隔的文本文件。我逐行閱讀,逐欄閱讀。我在每列中做了少許更改,並將該行寫入新文件。當我用perl基於標籤的拆分行錯過空列 - Perl
my @aLastOldElements = split(/\t/, $_);
我錯過到底空列的分割功能來讀取每列。例如,如果文件有33個製表符分隔的列,最後10個列是空的。分割函數創建大小爲23的數組。我想擁有所有的列。因爲這樣文件的標題(33列)與數據(23列)不匹配,並且在將文件寫入數據庫時出現錯誤。
split
接受可選的第三個參數來返回最大數量的字段。如果這是目前空尾隨字段將不會被丟棄:
perl -E '@arr = split(/ /, "foo bar ", 100); say scalar @arr'
14
只要選項卡,在該行的末尾空字段單獨存在,這應該總是給你的陣列中的33場,即使最後10個是空的。 (在我的例子中,有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)
如果您知道列應該在那裏,無論他們是否有任何數據,您可以自己確保結果。
my @aLastOldElements = split(/\t/, $_);
my $short_fall = 33 - @aLastOldElements;
if ($short_fall > 0) {
push @aLastOldElements => ('') x $short_fall;
}
那麼如果我們在該行之間有空字段會怎麼樣。例如「foo \ t bar \ t \ t hello \ t」 – 2013-05-10 13:21:24
@ MI.Sarwar:查看我剛剛添加的修改。 – 2013-05-10 13:45:29
除非實際上不要超過100個結果,否則不應使用100作爲限制。如果你只是想要一個任意大的限制,使用'-1'。 – cjm 2013-05-10 14:13:11