2011-11-21 44 views

回答

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

如果你感到安全,您的數據將不包含嵌入式標籤,你也許會簡單地分裂,而不是使用文本:: CSV_XS上的標籤行了,閃避:

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

是的,我不知何故錯過了關於跳過空白/空白行的評論。 – Zaid

3

我會在第二個文件的值中填充一個哈希值。將值設置爲1

然後,我會做一個簡單的while(<FILE>)循環在關鍵字段的散列中進行查找。如果散列中有條目,則打印該行。否則繼續前進。

Perl的哈希查找非常快,做了1500萬次應該是沒問題的。

+0

Perl的應該很容易做到在任何當前的CPU上,每秒有幾百萬次哈希查找(在不太可笑的長字符串上)。 – tsee

相關問題