求教大文本文件字符串的查找替换效率问题【已解决】
本帖最后由 dtooboss 于 2013-9-28 08:12 编辑文件A格式如下(大约10万行)120@@@@ACH_TITLE_25@@@@Silverware@@@@银牌
121@@@@ACH_TITLE_26@@@@Control@@@@控制
122@@@@ACH_TITLE_27@@@@You Got Mail@@@@你有邮件来了
123@@@@ACH_TITLE_28@@@@Rising Star@@@@冉冉升起的新星
124@@@@ACH_TITLE_29@@@@Bros Gonna Bro@@@@无基不欢
125@@@@ACH_TITLE_3@@@@Beast Mode@@@@野兽模式
126@@@@ACH_TITLE_30@@@@Friends Forever@@@@永远的朋友
127@@@@ACH_TITLE_31@@@@Moving On Up@@@@天天向上
128@@@@ACH_TITLE_32@@@@Just Dropped In@@@@碰巧路过
129@@@@ACH_TITLE_33@@@@Bling Bling@@@@闪亮
130@@@@ACH_TITLE_34@@@@Best Friends Forever@@@@永远的好朋友
131@@@@ACH_TITLE_35@@@@On Your Way@@@@在你的路上
132@@@@ACH_TITLE_36@@@@Teamwork@@@@团队合作
133@@@@ACH_TITLE_37@@@@Challenging@@@@挑战中
134@@@@ACH_TITLE_38@@@@Big Game@@@@盛大的比赛
135@@@@ACH_TITLE_39@@@@On My Own@@@@一己之力
136@@@@ACH_TITLE_4@@@@Seconds, Please@@@@就几秒钟,求你了
137@@@@ACH_TITLE_40@@@@Thanks, Tips@@@@谢谢,这是小费
138@@@@ACH_TITLE_41@@@@From Me To You@@@@真情传递
139@@@@ACH_TITLE_42@@@@Skills to Pay the Bills@@@@赚钱能力
140@@@@ACH_TITLE_43@@@@Cup For Two@@@@两个人的奖杯
141@@@@ACH_TITLE_44@@@@It's Mine Now@@@@现在是我的了
142@@@@ACH_TITLE_45@@@@Started From The Bottom…@@@@从底层坐起……
143@@@@ACH_TITLE_46@@@@Maxed Out@@@@刷爆在文件 B.txt 中查找 A.txt 中每行的英文内容并替换为指定字符串
B.TXT 的格式如下 (10万行左右)ACH_TITLE_18@@@@Fuel For My Club@@@@
ACH_TITLE_19@@@@Collecting Silverware@@@@
ACH_TITLE_2@@@@What a Hit, Son!@@@@
ACH_TITLE_20@@@@Hey Look, a Free Gold Pack!@@@@
ACH_TITLE_21@@@@Passing on the Armband@@@@
ACH_TITLE_22@@@@Long Term Signing@@@@
ACH_TITLE_23@@@@First Mission@@@@
ACH_TITLE_24@@@@You Struck Gold!@@@@
ACH_TITLE_25@@@@Silverware@@@@
ACH_TITLE_26@@@@Control@@@@
ACH_TITLE_27@@@@You Got Mail@@@@
ACH_TITLE_28@@@@Rising Star@@@@
ACH_TITLE_29@@@@Bros Gonna Bro@@@@
ACH_TITLE_3@@@@Beast Mode@@@@
ACH_TITLE_30@@@@Friends Forever@@@@
ACH_TITLE_31@@@@Moving On Up@@@@
ACH_TITLE_32@@@@Just Dropped In@@@@
ACH_TITLE_33@@@@Bling Bling@@@@
ACH_TITLE_34@@@@Best Friends Forever@@@@
ACH_TITLE_35@@@@On Your Way@@@@
ACH_TITLE_36@@@@Teamwork@@@@
ACH_TITLE_37@@@@Challenging@@@@
ACH_TITLE_38@@@@Big Game@@@@
ACH_TITLE_39@@@@On My Own@@@@
ACH_TITLE_4@@@@Seconds, Please@@@@
ACH_TITLE_40@@@@Thanks, Tips@@@@
ACH_TITLE_41@@@@From Me To You@@@@
ACH_TITLE_42@@@@Skills to Pay the Bills@@@@
ACH_TITLE_43@@@@Cup For Two@@@@
ACH_TITLE_44@@@@It's Mine Now@@@@以下是我写的简单脚本#include <file.au3>
#include <Array.au3>
#include <string.au3>
$file = 'A.txt'
$lin = _FileCountLines($file)
$rfile = FileOpen('B.txt', 32)
$wfile = FileRead($rfile)
For $x = $lin To 1 Step -1
$str = FileReadLine($file, $x)
$stra = StringSplit($str, '@@@@', 1)
If $stra = 4 Then
$wfile = StringReplace($wfile, '@@@@' & $stra & '@@@@', '####' & $stra & '####' & $stra)
EndIf
ConsoleWrite($x & @CRLF)
Next
FileClose($rfile)
$ofile = FileOpen('C.txt', 34)
FileWrite($ofile, $wfile)
FileClose($ofile)
在文件 B.txt 中查找 A.txt 中每行的英文内容并替换为指定字符串后
最后输出为C.txt
注: A 文件和B 文件 行数 顺序 大小 都不相同
竟然跑了6小时~~~,也尝试过用数组,一样慢。
求大家给想想办法~
付文件:
数组更慢呀~~~
#include <file.au3>
#include <Array.au3>
#include <string.au3>
$af = FileOpen('a.txt',32)
$bf = FileOpen('b.txt',32)
Local $sData = FileRead($af)
Local $bData = FileRead($bf)
Local $atmp = StringRegExp($sData, '(?m)^(\d+)@@@@(.+)@@@@(.+)@@@@(.+)\s*$', 3)
Local $btmp = StringRegExp($bData, '(?m)^(.+)@@@@(.+)@@@@(.+)\s*$', 3)
If @Error Then Exit
Local $aData, $x
Local $bData, $y
For $i = 0 To UBound($atmp) - 1 Step 4
$aData[$x] = $atmp[$i]
$aData[$x] = $atmp[$i + 1]
$aData[$x] = $atmp[$i + 2]
$aData[$x] = $atmp[$i + 3]
$x += 1
Next
For $i = 0 To UBound($btmp) - 1 Step 3
$bData[$y] = $btmp[$i]
$bData[$y] = $btmp[$i + 1]
$bData[$y] = $btmp[$i + 2]
$y += 1
Next
;以下为查找(省略~~~),这样更慢~~~~
把两个10万行的文件弄上来看下 sqlite好像可以搞 6小时!!
楼主真有耐性~
超过1分钟都觉得是不可想像的了... 没有文件,所以实测不了,模拟了一下
将b文件重复复制成10万5000行,A文件数据使用了楼主给出的内容,实测全部用时为1秒钟(1034.7458799966,包括输出文件到硬盘) 回复 6# annybaby
请教教思路。我也找了个20万行的大文件测试了一下。
发现搜索起来挺慢的,每秒钟只能处理几次。 没有文件,所以实测不了,模拟了一下
将b文件重复复制成10万5000行,A文件数据使用了楼主给出的内容,实测全 ...
annybaby 发表于 2013-9-26 15:50 http://www.autoitx.com/images/common/back.gif
不好意思,求思路,刚回来,测试文本已上传。
回复 8# dtooboss
没有细看你文件的内容,下载下来直接F5的,你看一下是不是你需要的
总用时是2秒多(我的是07年的老爷机,你的机子应该可以700毫秒)
2206.4619999975
请按任意键继续. . .
PS:使用了hash表和字符串拆分来做 回复 9# annybaby
果然……高阶。
请问能否指教一下实现方法? 回复dtooboss
没有细看你文件的内容,下载下来直接F5的,你看一下是不是你需要的
总用时是2秒多 ...
annybaby 发表于 2013-9-26 22:15 http://www.autoitx.com/images/common/back.gif
真是大神呀~~~,求实现方法~。
谢谢了~~ 回复 11# dtooboss
前面已经说了,是用了hash表和字符串拆分,其中hash表在AU3中是assign和isdeclared,字符串拆分你当然是懂的...
我使用的工具不是au3,但那是因为我对另外一个工具更熟悉些(好长一段时间没用AU3了),虽然它的执行效率是会比AU3高一些,但你也可以想像,两者相差绝不可能会是2秒和6小时的差别!
AU3来做的话,应该在35秒左右吧
你可以参看论坛一些朋友有关assign相关的使用代码 回复dtooboss
前面已经说了,是用了hash表和字符串拆分,其中hash表在AU3中是assign和isdeclared,字符串 ...
annybaby 发表于 2013-9-27 07:24 http://www.autoitx.com/images/common/back.gif
虽然不会hash,对assign函数也没用过,还是谢谢你了。能否贴下其他工具的主要源码? 回复 13# dtooboss
已经发私信了.. 回复dtooboss
已经发私信了..
annybaby 发表于 2013-9-27 08:26 http://www.autoitx.com/images/common/back.gif
十分感谢~~
页:
[1]
2