Perl помогает заменить запятые и встраивать значения с помощью символов Ctrl - PullRequest
0 голосов
/ 18 февраля 2011

Мне нужна помощь с настройкой моего 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

Я также создаю уникальное значение (MD5) с префиксом "__pkey__".

Имя каждого столбца начинается с ^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 ]

1 голос
/ 18 февраля 2011

Это похоже на работу:

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() вместо следующей.

Если вам не нравится цикл «все на одной строке», используйте закомментированный.

1 голос
/ 18 февраля 2011

Что-то вроде этого должно дать вам тот результат, который вы показали

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...