perl - обработка текста - вывод в csv файл - PullRequest
2 голосов
/ 15 июля 2010

Есть ли способ в perl экспортировать данные из файла в файл csv.Я имею в виду,

Скажем, у меня есть файл следующим образом ..

field1=value1,filed2=value2
field1=value3,filed2=value4
field1=value5,filed2=value6

Я хочу экспортировать его в формат Excel следующим образом.

field1  field2
value1  value2
value3  value4
value5  value6

в любом случаеделать это ??

Кроме того, здесь есть небольшая проблема.Предположим, я экспортирую еще один файл в тот же CSV-файл ... с содержимым, подобным ..

field1=value1,fields2=value8

мой CSV должен выглядеть так:

field1  field2
value1  value2
        value8
value3  value4
value5  value6

, если есть более простой способ сделать это,Прямо сейчас я делаю это вручную.Любая идея, если есть лучший способ.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 15 июля 2010

Взгляните на Text :: CSV (для чтения ваших CSV-файлов в структуры данных perl) и Spreadsheet :: WriteExcel (для записи этих данных обратно в формате Excel).

1 голос
/ 15 июля 2010

Вот, пожалуйста,

#!/usr/bin/env perl

open (IMPORT, "import.txt") || die "Unable to read import file";

my @lines = <IMPORT>;
my @formatted = ();

for my $line (@lines) {
    $line =~ s/^.*=(.*?),.*?=(.*?)/$1\t$2/g;
    push(@formatted, $line);
}

my $current_field;

for my $format_line (sort @formatted) {
    my($field1, $field2) = (split(/\t/, $format_line));
    if ($field1 ne $current_field) {
        print "$field1";
    }
    print "\t$field2";

    $current_field = $field1;
}

import.txt содержит

field1=value1,filed2=value2
field1=value3,filed2=value4
field1=value5,filed2=value6
field1=value1,fields2=value8

, что приводит к

value1  value2
        value8
value3  value4
value5  value6
0 голосов
/ 15 июля 2010

Прежде чем читать в новом файле, прочитайте в целевом CSV-файле (если он не пустой). Создайте хэш хэшей. Ключом для первого хэша HashA будут значения field1. Значением такого ключа, как value1, будет хэш-код HashB. HashB будет иметь ключи, которые являются значениями field2, которые соответствуют value1. Значение ключа в HashB будет просто «1». (Неважно, что это.)

Теперь, когда вы хотите экспортировать второй файл, вы просто добавляете новые ключи в HashB для каждого ключа для HashA.

Вот ваш пример.

Сначала вы делаете первый файл, чтобы получить

значение1 -> {значение2 -> 1}
значение3 -> {значение4 -> 1}
значение5 -> {значение6 -> 1}

Теперь, когда вы читаете второй файл со строкой field1 = value1, field2 = value8, вы просто добавляете ключ в HashB для value1

значение1 -> {значение2 -> 1, значение8 -> 1}
значение3 -> {значение4 -> 1}
значение5 -> {значение6 -> 1}

Теперь, когда вы перебираете HashA, вы печатаете ключи в column1 (для field1) и печатаете каждый ключ из HashB.

#!/usr/bin/perl

%hashA = ();

$hashA{"value1"}{"value2"} = 1;
$hashA{"value3"}{"value4"} = 1;
$hashA{"value5"}{"value6"} = 1;

foreach $value1 ( sort keys %hashA ) {
    foreach $value2 ( sort keys %{ $hashA{$value1} } ) {
        print "$value1, $value2\n";
    }
}

$hashA{"value1"}{"value8"} = 1;

print "\n\n";
foreach $value1 ( sort keys %hashA ) {
    foreach $value2 ( sort keys %{ $hashA{$value1} } ) {
        print "$value1, $value2\n";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...