2013-10-09 66 views
1

所以我是一個巨大的Perl新手,但我試圖解析製表符分隔文件到數組中。 我遇到的唯一問題是我的文件有不同數量的間距標籤。在Perl中解析製表符分隔文件

現在我在做@data = split("\t");但這隻能刪除一個選項卡,有沒有辦法在解析文件時刪除所有的選項卡?

+1

你想刪除標籤,還是你想分割字符串?你似乎對你想要做的事感到困惑。 – TLP

+1

另外,'split'\ t「'不會只刪除一個標籤,它會刪除所有的標籤。不過,它會爲連續的標籤創建一個空白字段。 – TLP

+0

不幸的是,不幸的是,這是一個製表符分隔的文件。你不能識別空字段,因爲它們與'\ t'的較長序列不可區分(除了最後一個字段,如果你將split的限制參數設置爲-1,那麼ypu只會是git,即使用@data = split(「\ t +」,$ _,-1);'。您可能需要用正確數量的空格替換標籤,然後將其視爲固定長度的記錄,假設所有內容都排隊並且您有一個標題行來確定間距。 –

回答

3

您可以分割的正則表達式,所以如果你需要拆就一個或多個製表符使用:

@data = split("\t+"); 

例子(Perl調試):

DB<1> $text = "one\ttwo\t\tthree\t\t\tfour" 

DB<2> @data = split("\t+", $text) 

DB<3> print join(", ", @data) 
one, two, three, four 
2

只需更換在分割之前的整個字符串中帶有單個標籤的多個標籤()

# A line with varying numbers of tabs 
my $line="\t\tField1\tField2\t\t\t\t\tField3"; 

# Replace all occurences of one or more tabs with single tab 
$line =~ s/\t+/\t/g; 

# Now split() 
0

你可以去這樣

#!/usr/bin/perl 
use strict; 
use warnings; 

open (IN, '<' , 'tabsfile'); 
my @arr; 

while(<IN>) { 
     $_ =~ s/\s+/ /g; 
     push @arr, $_; 
} 
close(IN); 

輸出:

]# cat tabsfile 
lkjdlksajdlkajsd    kdjlkasjd        ;lkwqd;wqd;qwkd;qwkd 
       lkewjflkjewflewjflwjf     lkewjflkejflewjf 
djflkajfdljf eljfdlewfjlewfj lkfjewlfkjewlkf lkdjewflkjewlkfjlkewjfew  dlkejfdlkjewflkjewlkfjjdlkajdflkjalfdjelfj 
     dkjklfjldskjfldsjf lkjdslkfjdslkjf:wq 

]# perl tabs.pl 
lkjdlksajdlkajsd kdjlkasjd ;lkwqd;wqd;qwkd;qwkd lkewjflkjewflewjflwjf lkewjflkejflewjf djflkajfdljf eljfdlewfjlewfj lkfjewlfkjewlkf lkdjewflkjewlkfjlkewjfew dlkejfdlkjewflkjewlkfjjdlkajdflkjalfdjelfj dkjklfjldskjfldsjf lkjdslkfjdslkjf:wq 
]# 

你可以選擇什麼來取代正則表達式\t\s

相關問題