Логика преобразования Perl - обработка файлов или БД - PullRequest
0 голосов
/ 17 февраля 2011

Я строю логику преобразования для файла, который применяет определенные правила преобразования к полям в файле.Примеры таких правил преобразования:

  • Установка значений по умолчанию для определенных полей, если они пусты (если столбец 5 пуст, установите для него значение "Пусто")
  • Суммирование на основе файлав определенных столбцах (если в файле есть col1, col2 и col3, суммировать файл для агрегирования col3 для всех col1)
  • Подставляя строки в определенные поля (заменить все «ax» в col1 на «ay»)
  • И т. Д.

С точки зрения производительности, при выполнении этих преобразований для большого файла, лучше сделать это с помощью простой обработки файла (чтение файла построчно, использование хешей для суммирования, регулярные выражения для других преобразований и т. д.) или загрузите данные в таблицу базы данных, суммируйте и примените всю логику преобразования и загрузите ее обратно в файл?

Например, суммирование:

Исходный файл содержит:

A | B | C | 100 | 200 | 300

A | B | C | 200 | 100 | 0

A | X | C | 100 | 100| 100

Преобразованный файл имеет:

A | B | 300 | 300 | 300

A | X | 100 | 100 | 100

Ответы [ 2 ]

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

Предполагая, что данные, которые вы предоставили, эта проблема вполне понятна Perl без базы данных:

my %data;
while (my $line = <DATA>) {
    chomp $line;
    my ($c1, $c2, undef, @cols) = split /\|/, $line, -1;

    $data{"$c1|$c2"}[$_] += $cols[$_] for 0 .. $#cols;
}

print join('|' => $_, @{ $data{$_} }), "\n" for sort keys %data;

__DATA__
A|B|C|100|200|300
A|B|C|200|100|0
A|X|C|100|100|100

, которая печатает:

A|B|300|300|300
A|X|100|100|100

Вам, конечно, нужно будет написать кодостальные преобразования, но это должно дать вам начало.Даже если оказывается, что вам нужно обращаться к необработанным строкам более одного раза, предполагая, что ваши данные не гигантские, вы можете загрузить их в двумерный массив и затем выполнить свои проходы через него.Или вы можете использовать Tie::File для доступа к очень большому файлу, не читая его все.

0 голосов
/ 17 февраля 2011

Лучшим решением было бы кодировать систему в обоих направлениях и проводить измерения, чтобы решить, что лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...