Re: [問題] 多個關鍵字比對

看板Perl作者 (Cindy Wang)時間9年前 (2014/10/16 00:42), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《DRLai (蘇打)》之銘言: : 各位板友好 : 最近需要寫個多重比對的程式 : 想請教比較有效率的寫法 : 比對關鍵字 A B C : 輸入資料(文字檔) : A:a123 A:a456 B:b111 D:d1234 : B:bbb C:ccc : 資料共有上千萬筆,關鍵字假設為3個 : 每行資料長度不見得一樣 : 希望能得到的資料為冒號後面的值 : 以上述範例來說 : 得到的是 : a123 : a456 : b111 : bbb : ccc : 輸出順序沒關係,只要有取得就好 : 之前想到的方法是用 foreach 每個關鍵字去掃 : 但如果關鍵字有10個(m) : 資料有一千萬筆(n) : 那複雜度就是 m * n = 一億 : 另一個方法是把資料變成一筆一筆 : 接著把關鍵字用 join 方式串接 : 不知道有沒有其他更好的方式呢? 我試了這3種寫法... #!/usr/bin/perl local $/; my $data = <STDIN>; for my $key (qw(A B C D E F G H I J)) { while( $data =~ /\b$key:(\S+)/g ) { print "$1\n"; } } #real 0m4.502s #user 0m4.486s #sys 0m0.016s #!/usr/bin/perl local $/; my $data = <STDIN>; while( $data =~ /\b[ABCDEFGHIJ]:(\S+)/g ) { print "$1\n"; } #real 0m2.751s #user 0m2.731s #sys 0m0.020s # 這一種只適用 key 為一個字的.. #!/usr/bin/perl local $/; my $data = <STDIN>; while( $data =~ /\b(?:A|B|C|D|E|F|G|H|I|J):(\S+)/g ) { print "$1\n"; } # real 0m2.993s # user 0m2.978s # sys 0m0.016s 以下是我生成測試資料的程式: #!/usr/bin/perl for(1..1000_0000) { my $key = ('A'..'Z')[rand 26]; my $data = join '', map { ('a'..'z','0'..'9')[rand 36] } 1..4; print "$key:$data\n"; } # 產生測試資料跑比較久, 16 秒左右.. XD -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 112.121.80.249 ※ 文章網址: http://www.ptt.cc/bbs/Perl/M.1413391367.A.ADD.html

10/16 02:26, , 1F
推實驗!
10/16 02:26, 1F

10/18 17:38, , 2F
感謝!我來試試看
10/18 17:38, 2F
文章代碼(AID): #1KFgG7hT (Perl)
討論串 (同標題文章)
文章代碼(AID): #1KFgG7hT (Perl)