perl帮助替换逗号并使用ctrl字符嵌入值

时间:2011-02-18 01:18:22

标签: perl

我需要一些帮助来调整我的perl脚本。

我有一个逗号分隔值的输入文件,如下所示:

to_em,from_em,flags,updated,marks
xtr133823@xra.co.nz#hv,abc@def.com,16,2007-08-18 16:18:50,33

第一行是列名称 to_em from_em flags updated marks,以下记录是每列的值:

to_em = xtr133823@xra.co.nz#hv
from_em = abc@def.com
flags = 16
updated = 2007-08-18 16:18:50
marks = 33

我也在创建一个以“__pkey__”为前缀的唯一值(MD5)。

每个列名称以^E开头。每个值都以^A开头,包括十六进制值。记录将以^D结束。

我希望最终输出文件如下所示:

__pkey__^Ad41d8cd98f00b204e9800998ecf8427e^Eto_em^Axtr133823@xra.co.nz#hv^Efrom_em^Aabc@def.com^Eflags^A16^Eupdated^A2007-08-18 16:18:50^Emarks^A33^E^D

但是,它会像这样出现:

__pkey__^Ad41d8cd98f00b204e9800998ecf8427e^E^Ato_em^E^D__pkey__^A5c09354d0d3d34c96dbad8fa14ff175e^E^Axtr133823@xra.co.nz#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;

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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中的字段。

它读取每个后续​​行,将其删除,将其拆分为字段,在其上运行摘要,然后生成输出行。

最后,它会打印所有累积的数据。

如果您想要实际控制字符而不是插入符号,请使用chr()而不是以下字符行。

如果您不喜欢一对一循环,请使用已注释掉的循环。