A,B文件对比,输出C文件,求高效算法
时间:2011-05-19
来源:互联网
我昨天已经发了一贴,人气不高,今天再发一贴,并给出实例
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28