2011-02-18 41 views
0

我需要一些幫助來調整我的Perl腳本。perl幫助替換逗號和嵌入ctrl字符的值

我有一個輸入文件,逗號分隔值,像這樣:

to_em,from_em,flags,updated,marks 
[email protected]#hv,[email protected],16,2007-08-18 16:18:50,33 

第一行是列名to_em from_em flags updated marks和下面的記錄是每個列的值:

to_em = [email protected]#hv 
from_em = [email protected] 
flags = 16 
updated = 2007-08-18 16:18:50 
marks = 33 

我還創建了一個唯一值(MD5),前綴爲「__pkey__」。

每列名稱以^E開頭。每個值以^A開頭,包括十六進制值。記錄將以^D結束。

我想最終的輸出文件看起來像這樣:

__pkey__^Ad41d8cd98f00b204e9800998ecf8427e^Eto_em^[email protected]#hv^Efrom_em^[email protected]^Eflags^A16^Eupdated^A2007-08-18 16:18:50^Emarks^A33^E^D 

但是,它出來是這樣的:

__pkey__^Ad41d8cd98f00b204e9800998ecf8427e^E^Ato_em^E^D__pkey__^A5c09354d0d3d34c96dbad8fa14ff175e^E^[email protected]#hv^E^D 

這裏是我的代碼:

use strict; 
use Digest::MD5 qw(md5_hex); 
my $data = ''; 
while (<>) { 
my $digest = md5_hex($data); 
    chomp; 
    my ($val) = split /,/; 
    $data = $data. "__pkey__^A$digest^E^A$val^E^D"; 
} 
print $data; 
exit; 
+0

你的代碼幾乎與你想要的結果沒有關係,除了while循環和split。 – DVK 2011-02-18 01:46:02

回答

1

這似乎工作:

use strict; 
use Digest::MD5 qw(md5_hex); 
my $data = ''; 
my $line1 = <>; 
chomp $line1; 
my @heading = split /,/, $line1; 
#my ($sep1, $sep2, $eor) = (chr(1), chr(5), chr(4)); 
my ($sep1, $sep2, $eor) = ("^A", "^E", "^D"); 
while (<>) 
{ 
    my $digest = md5_hex($data); 
    chomp; 
    my (@values) = split /,/; 
    my $extra = "__pkey__$sep1$digest$sep2" ; 
    $extra .= "$heading[$_]$sep1$values[$_]$sep2" for (0..$#values); 
    #$extra .= "$heading[$_]$sep1$values[$_]$sep2" for (0..scalar(@values)-1); 
    #for my $i (0..$#values) 
    #{ 
    # $extra .= "$heading[$i]$sep1$values[$i]$sep2"; 
    #} 
    $data .= "$extra$eor"; 
} 
print $data; 

它讀取的第一行,它要吃掉,並將其拆分成田入陣@heading

它讀取每個後續​​行,chomps它,將其拆分成字段,運行它上的摘要,然後生成輸出行。

最後,它打印所有累積的數據。

如果您想要實際控制字符而不是字母,請使用chr()而不是以下字符。

如果您不喜歡所有單線循環,請使用註釋掉的循環。

+0

這個效果很好!感謝您的描述,並向我展示其他選項。 – jdamae 2011-02-18 02:15:33

1

喜歡的東西這應該會讓你看到你輸出的那種輸出

use strict; 
use Digest::MD5 qw(md5_hex); 
my $data = ''; 

my $first_line = <>; 
chomp($first_line); 
my @columns = split(/,/, $first_line); 
while (<>) { 
    chomp; 
    my (@vals) = split /,/; 
    my $record = ""; 
    foreach my $column_num (0..$#columns) { 
     $record .= "^E$columns[$column_num]^A$vals[$column_num]"; 
    } 
    my $digest = md5_hex($data); 
    $data = $data. "__pkey__^A$digest$record^D"; 
} 
print $data; 
exit; 
+0

謝謝!效果很好。 – jdamae 2011-02-18 02:16:01