亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 5559 | 回復(fù): 12
打印 上一主題 下一主題

A,B文件對比,輸出C文件,求高效算法 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-05-19 11:34 |只看該作者 |倒序瀏覽
我昨天已經(jīng)發(fā)了一貼,人氣不高,今天再發(fā)一貼,并給出實例

A是明細(xì)文件,B是關(guān)鍵字文件,
根據(jù)A的第二列值(逗號分隔),去B(只有一列)的關(guān)鍵字文件匹配,存在,則輸出到C文件,
A,B,C的樣例數(shù)據(jù):
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個關(guān)鍵字
耗時:75秒

因為正式環(huán)境的文件預(yù)計有2G左右大小,因此才更優(yōu)算法,謝謝各位大蝦幫忙。

論壇徽章:
0
2 [報告]
發(fā)表于 2011-05-19 11:40 |只看該作者
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]});
     }

以減少一點點操作,能提一點點速,肯定不明顯。

論壇徽章:
0
3 [報告]
發(fā)表于 2011-05-19 11:48 |只看該作者
回復(fù)2樓,呵呵,嘗試了一下,節(jié)省了7秒鐘。

論壇徽章:
1
獅子座
日期:2013-12-16 16:09:24
4 [報告]
發(fā)表于 2011-05-19 12:18 |只看該作者
my $reg=join '|',keys %hashFile;
while (<FH>) {
        print OUTFILE "$_" if /^.*,($reg),/;
}

論壇徽章:
0
5 [報告]
發(fā)表于 2011-05-19 14:15 |只看該作者
回復(fù)4樓,采用你的寫法后,只需要24秒,厲害啊,呵呵。
能否稍微解釋一下含義,謝謝!

論壇徽章:
0
6 [報告]
發(fā)表于 2011-05-19 14:28 |只看該作者
split是有點慢,在大量處理文本數(shù)據(jù)的時候,盡量用別的方式。正則也是較慢的。如果第一列是固定列寬,LZ可以使用substr,那樣會快不少。

論壇徽章:
46
15-16賽季CBA聯(lián)賽之四川
日期:2018-03-27 11:59:132015年亞洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49雙魚座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亞冠之布里斯班獅吼
日期:2015-07-13 10:44:56
7 [報告]
發(fā)表于 2011-05-19 14:30 |只看該作者
人氣不高是因為問題簡單啊,各方面昨天基本都說到了……總不至于1+1也引起熱烈討論吧

論壇徽章:
0
8 [報告]
發(fā)表于 2011-05-19 14:36 |只看該作者

  1. while (<FH>)
  2.      {
  3.         $_ =~ m/^\d+,(\w)/;
  4.         print OUTFILE "$_" if defined($hashFile{$1});
  5.      }
復(fù)制代碼

論壇徽章:
0
9 [報告]
發(fā)表于 2011-05-19 15:13 |只看該作者
謝謝 iamlimeng 的提示,第一列恰好是定長,因此我修改了 ttcn_cu 的語句為:
while (<FH>) {
        print OUTFILE "$_" if /^.{11},($reg),/;
      }
結(jié)果又快了7秒鐘。

論壇徽章:
0
10 [報告]
發(fā)表于 2011-05-27 15:52 |只看該作者
1. 給正則加上 (?:
2. 另外提前編譯正則

可以再試試
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP