Наиболее эффективный способ поиска очень большого текстового файла и строк вывода, соответствующих любому из очень большого числа терминов, в другой файл - PullRequest
3 голосов
/ 21 ноября 2011

У меня ~ 15 миллионов строк файла. У меня есть другой файл с 500 000 строк. Я хочу сохранить строки из большого файла, где определенное поле соответствует строке во втором файле. Большой файл с разделителями табуляции.

Как бы вы сделали это, например, в Perl?

Ответы [ 2 ]

5 голосов
/ 21 ноября 2011

Вы могли бы выиграть от использования модуля CSV для анализа данных из большого файла.Это также может быть излишним, и больше проблем, чем оно того стоит, что вы должны судить сами.Имейте в виду, что Text :: CSV_XS , используемый ниже, может изменить ваши данные в соответствии со стандартами CSV, и есть много вариантов настройки того, как выглядит ваш вывод.

Это базовый сценарий, которыйможет начать вас

use strict;
use warnings;
use autodie;
use Text::CSV_XS;

open my $lookup, '<', "lookupfile";
my %lookup;
while (<$lookup>) {
    next if /^\s*$/;   # remove empty lines
    chomp;             # remove newline
    $lookup{$_} = 1;
}
close $lookup;

my $csv = Text::CSV_XS->new ({
    binary    => 1, 
    eol       => $/,
    sep_char  => "\t",
});
open my $bigfile, '<', 'bigfile';
while (my $row = $csv->getline ($bigfile)) {
    if (defined ($lookup{$row->[0]})) {
        $csv->print(\*STDOUT, $row);
    }
}

Если вы уверены, что ваши данные не будут содержать встроенных вкладок, вам может быть просто разделить строку на вкладках вместо использования Text :: CSV_XS:

while (<$bigfile>) {
    chomp;
    my @row = split /\t/;
    if (defined $lookup{$row[0]}) {
        print "$_\n";
    }
}
3 голосов
/ 21 ноября 2011

Я бы заполнил хеш-ключ со значениями из второго файла.Установите значения 1.

Затем я бы сделал простой цикл while(<FILE>), выполняя поиск в хэше ключевого поля.Если в хэше есть запись, выведите строку.Иначе двигайтесь дальше.

Perl хеш-поиск довольно быстр, делать это 15 миллионов раз должно быть хорошо.

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