2010-11-18 45 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"; 
} 
相關問題