我需要一些帮助来调整我的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;
答案 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()
而不是以下字符行。
如果您不喜欢一对一循环,请使用已注释掉的循环。