A,B文件对比,输出C文件,求高效算法

我昨天已经发了一贴,人气不高,今天再发一贴,并给出实例

A是明细文件,B是关键字文件,
根据A的第二列值(逗号分隔),去B(只有一列)的关键字文件匹配,存在,则输出到C文件,
A,B,C的样例数据:
A文件:
123,B,343Y65
321,C,6547657
435,D,23R4RT353
678,A,423242

B文件:
A
B

C文件:
123,B,343Y65
678,A,423242

具体算法:
sub filterFile
{
        my ($processFile,$filterFile1,$outputFile) = @_;
        my %hashFile;
       
        open (OUTFILE, ">>${outputFile}") or die "can't open file: $outputFile";
       
        open FH, "<$filterFile1" or die "can't open file: $filterFile1";
    while (<FH>)
     {
         chomp;
        $hashFile{$_} = 1;
     }
    close (FH);
       
        open FH, "<$processFile" or print "can't open file: $processFile";
    while (<FH>)
     {
        chomp;
        my @filed =split /,/ ;
        print OUTFILE "$_\n" if (defined$hashFile{$filed[1]});
     }
     
close (FH);
close(OUTFILE);
}      

测试样例:
A文件:372M
B文件:20个关键字
耗时:75秒

因为正式环境的文件预计有2G左右大小,因此才更优算法,谢谢各位大虾帮忙。

作者: fikong2005   发布时间: 2011-05-19

while (<FH>)
     {
        chomp;
        my @filed =split /,/ ;
        print OUTFILE "$_\n" if (defined$hashFile{$filed[1]});
     }

改为

while (<FH>)
     {
        my @filed =split(',',$_);
        print OUTFILE "$_" if ($hashFile{$filed[1]});
     }

以减少一点点操作,能提一点点速,肯定不明显。

作者: iamlimeng   发布时间: 2011-05-19

回复2楼,呵呵,尝试了一下,节省了7秒钟。

作者: fikong2005   发布时间: 2011-05-19

my $reg=join '|',keys %hashFile;
while (<FH>) {
        print OUTFILE "$_" if /^.*,($reg),/;
}

作者: ttcn_cu   发布时间: 2011-05-19