我有~15萬線文件。我有另外約500,000行的文件。我想保留大文件中的特定字段與第二個文件中的行匹配的行。大文件是製表符分隔的。最有效的方法來搜索非常大的文本文件和輸出行匹配任何非常大量的術語到另一個文件
例如,你會如何在Perl中做這件事?
我有~15萬線文件。我有另外約500,000行的文件。我想保留大文件中的特定字段與第二個文件中的行匹配的行。大文件是製表符分隔的。最有效的方法來搜索非常大的文本文件和輸出行匹配任何非常大量的術語到另一個文件
例如,你會如何在Perl中做這件事?
您可能會從使用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);
}
}
如果你感到安全,您的數據將不包含嵌入式標籤,你也許會簡單地分裂,而不是使用文本:: CSV_XS上的標籤行了,閃避:
while (<$bigfile>) {
chomp;
my @row = split /\t/;
if (defined $lookup{$row[0]}) {
print "$_\n";
}
}
我會在第二個文件的值中填充一個哈希值。將值設置爲1
。
然後,我會做一個簡單的while(<FILE>)
循環在關鍵字段的散列中進行查找。如果散列中有條目,則打印該行。否則繼續前進。
Perl的哈希查找非常快,做了1500萬次應該是沒問題的。
Perl的應該很容易做到在任何當前的CPU上,每秒有幾百萬次哈希查找(在不太可笑的長字符串上)。 – tsee
是的,我不知何故錯過了關於跳過空白/空白行的評論。 – Zaid