3 Stimmen

Effizienteste Methode zum Durchsuchen sehr großer Textdateien und zur Ausgabe von Zeilen, die auf eine sehr große Anzahl von Begriffen passen, in eine andere Datei

Ich habe eine Datei mit ~15 Millionen Zeilen. Ich habe eine andere Datei mit etwa 500.000 Zeilen. Ich möchte Zeilen aus der großen Datei behalten, in denen ein bestimmtes Feld mit der Zeile in der zweiten Datei übereinstimmt. Die große Datei ist tabulatorgetrennt.

Wie würden Sie das zum Beispiel in Perl machen?

5voto

TLP Punkte 65295

Es könnte von Vorteil sein, ein csv-Modul zum Parsen der Daten aus der großen Datei zu verwenden. Es könnte aber auch ein Overkill sein und mehr Mühe machen, als es wert ist, das müssen Sie selbst beurteilen. Beachten Sie, dass Text::CSV_XS kann Ihre Daten so verändern, dass sie den csv-Standards entsprechen, und es gibt viele Optionen, um das Aussehen Ihrer Ausgabe zu verändern.

Dies ist ein einfaches Skript, das Ihnen den Einstieg erleichtern könnte.

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);
    }
}

Wenn Sie sich sicher sind, dass Ihre Daten keine eingebetteten Tabulatoren enthalten, können Sie die Zeile auch einfach an Tabulatoren aufteilen, anstatt Text::CSV_XS zu verwenden:

while (<$bigfile>) {
    chomp;
    my @row = split /\t/;
    if (defined $lookup{$row[0]}) {
        print "$_\n";
    }
}

3voto

sarnold Punkte 99402

Ich würde einen Hash mit den Werten aus der zweiten Datei auffüllen. Setzen Sie die Werte auf 1 .

Dann würde ich eine einfache while(<FILE>) Schleife, die im Hash nach dem Schlüsselfeld sucht. Wenn es einen Eintrag im Hash gibt, wird die Zeile gedruckt. Andernfalls machen Sie weiter.

Die Hash-Lookups von Perl sind ziemlich schnell, 15 Millionen Mal sollte das kein Problem sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X