2013-05-10 52 views
1

我有一個製表符分隔的文本文件。我逐行閱讀,逐欄閱讀。我在每列中做了少許更改,並將該行寫入新文件。當我用perl基於標籤的拆分行錯過空列 - Perl

my @aLastOldElements = split(/\t/, $_); 

我錯過到底空列的分割功能來讀取每列。例如,如果文件有33個製表符分隔的列,最後10個列是空的。分割函數創建大小爲23的數組。我想擁有所有的列。因爲這樣文件的標題(33列)與數據(23列)不匹配,並且在將文件寫入數據庫時​​出現錯誤。

回答

4

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) 
+0

那麼如果我們在該行之間有空字段會怎麼樣。例如「foo \ t bar \ t \ t hello \ t」 – 2013-05-10 13:21:24

+0

@ MI.Sarwar:查看我剛剛添加的修改。 – 2013-05-10 13:45:29

+3

除非實際上不要超過100個結果,否則不應使用100作爲限制。如果你只是想要一個任意大的限制,使用'-1'。 – cjm 2013-05-10 14:13:11

1

如果您知道列應該在那裏,無論他們是否有任何數據,您可以自己確保結果。

my @aLastOldElements = split(/\t/, $_); 
my $short_fall  = 33 - @aLastOldElements; 
if ($short_fall > 0) { 
    push @aLastOldElements => ('') x $short_fall; 
}