最有效的方法来搜索非常大的文本文件和输出行匹配任何非常大的术语到另一个文件

时间:2011-11-21 00:41:30

标签: perl search large-files

我有~15万行文件。我有另一个大约500,000行的文件。我想保留大文件中的行,其中特定字段与第二个文件中的行匹配。大文件是制表符分隔的。

例如,你会如何在Perl中执行此操作?

2 个答案:

答案 0 :(得分:5)

使用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";
    }
}

答案 1 :(得分:3)

我填充了键入第二个文件中值的哈希值。将值设置为1

然后我做一个简单的while(<FILE>)循环,在关键字段的散列中进行查找。如果哈希中有条目,则打印该行。继续前进。

Perl的哈希查找非常快,做了1500万次应该没问题。