2013-10-09 64 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

相关问题