2010-11-18 65 views
0

我对Perl相当陌生,对Perl的'正确'语法几乎一无所知。如何在Perl中正确处理包含制表符分隔值的文件?

我有一个文本文件,我每天使用的名称列表和其他信息为我们的用户。此文件每天更改,有时会有两行(制表符分隔),其他时间有100行以上。

该文件也在连续6-9列数据之间变化。我已经放在一起使用选项卡上的拆分功能的Perl脚本,但我遇到的问题是,如果我行a,其中有5列,然后添加第二行b有6其中的所有列都填充了数据。

我无法弄清楚如何让Perl看到那行只有5列的数据,并继续从该点解析文本文件。它继续,但输出包装奇怪的线条。我怎样才能解决这个问题?我希望这是有道理的。

+5

发表一些代码和示例数据。 – cdhowie 2010-11-18 21:52:46

回答

4

你将不得不发布一些代码,可能是一些样本数据,但这里是分析不同长度的行没有问题代码。

脚本:

#!/usr/bin/perl 
use strict; 

while (<STDIN>) 
{ 
    chomp; 
    my @info = split("\t"); 
    print join(";", @info), "\n"; 
} 

exit; 

测试文件:

jsmith 101  777-222-5555 Office 1  Building 1  Manager 
    aposse 104  777-222-5556 Office 2  Building 2  Stock Clerk 
    jbraza 105  777-222-5557 Office 3 
    mcuzui 102  777-222-5557 Office 3  Building 3  Cashier 
    ghines 107  777-222-5557 Office 3 

输出:

%> test.pl < file.txt 
jsmith;101;777-222-5555;Office 1;Building 1;Manager 
aposse;104;777-222-5556;Office 2;Building 2;Stock Clerk 
jbraza;105;777-222-5557;Office 3 
mcuzui;102;777-222-5557;Office 3;Building 3;Cashier 
ghines;107;777-222-5557;Office 3 
+0

我意识到我的错误,我的分割语法不正确。谢谢,我真的很感谢大家在这里的帮助。祝大家下午好。 – Tim 2010-11-18 22:23:05

1

您应该发布一些示例数据和代码,并根据代码当前的作用以及您希望做什么来解释所需的行为。 split将为您提供尽可能多的字段。

#!/usr/bin/perl 

use strict; use warnings; 

while (my $row = <DATA>) { 
    last unless $row =~ /\S/; 
    chomp $row; 
    my @cells = split /\t/, $row; 
    print "<@cells>\n"; 
} 

__DATA__ 
1 2 3 4 5 
a b c d e f 
+0

如上所述,感谢您的帮助,我的语法不正确。 – Tim 2010-11-18 22:23:53

1

Text::CSV模块也可用于解析制表符分隔值。实际上,Text::CSV可以解析由任何字符分隔的值。

从其POD

相关摘录:

该模块接受字符串或 文件作为输入,并且可利用任何 用户指定的字符作为 分隔符,分隔符和转义所以 它也许是更好的称为ASV (任何分隔值),而不仅仅是CSV,而不是 。

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Text::CSV; 

my $csv = Text::CSV->new({ 'sep_char' => "\t" }); 

open my $fh, '<', 'data.tsv' or die "Unable to open: $!"; 

my @rows; 
while (my $row_ref = $csv->getline($fh)) { 
    push @rows, $row_ref; 
} 

$csv->sep_char('|'); 
for my $row_ref (@rows) { 
    $csv->combine(@$row_ref); 
    print $csv->string(), "\n"; 
} 
相关问题