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左右大小,因此才更优算法,谢谢各位大虾帮忙。
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]});
}
以减少一点点操作,能提一点点速,肯定不明显。
{
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),/;
}
while (<FH>) {
print OUTFILE "$_" if /^.*,($reg),/;
}
作者: ttcn_cu 发布时间: 2011-05-19