找回密码
 加入
搜索
查看: 39355|回复: 18

[AU3基础] 求教大文本文件字符串的查找替换效率问题【已解决】

 火.. [复制链接]
发表于 2013-9-26 07:58:22 | 显示全部楼层 |阅读模式
本帖最后由 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[0] = 4 Then
                $wfile = StringReplace($wfile, '@@@@' & $stra[3] & '@@@@', '####' & $stra[3] & '####' & $stra[4])
        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小时~~~,也尝试过用数组,一样慢。
求大家给想想办法~


付文件:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2013-9-26 11:41:17 | 显示全部楼层
数组更慢呀~~~


#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[UBound($atmp) / 4][4], $x
Local $bData[UBound($btmp) / 3][3], $y
For $i = 0 To UBound($atmp) - 1 Step 4
$aData[$x][0] = $atmp[$i]
$aData[$x][1] = $atmp[$i + 1]
$aData[$x][2] = $atmp[$i + 2]
$aData[$x][3] = $atmp[$i + 3]
$x += 1
Next

For $i = 0 To UBound($btmp) - 1 Step 3
$bData[$y][0] = $btmp[$i]
$bData[$y][1] = $btmp[$i + 1]
$bData[$y][2] = $btmp[$i + 2]
$y += 1
Next

;以下为查找(省略~~~),这样更慢~~~~
发表于 2013-9-26 13:34:49 | 显示全部楼层
把两个10万行的文件弄上来看下
发表于 2013-9-26 14:04:20 | 显示全部楼层
sqlite好像可以搞
发表于 2013-9-26 14:49:46 | 显示全部楼层
6小时!!
楼主真有耐性~
超过1分钟都觉得是不可想像的了...
发表于 2013-9-26 15:50:12 | 显示全部楼层
没有文件,所以实测不了,模拟了一下

将b文件重复复制成10万5000行,A文件数据使用了楼主给出的内容,实测全部用时为1秒钟(1034.7458799966,包括输出文件到硬盘)
发表于 2013-9-26 16:43:44 | 显示全部楼层
回复 6# annybaby

请教教思路。我也找了个20万行的大文件测试了一下。
发现搜索起来挺慢的,每秒钟只能处理几次。
 楼主| 发表于 2013-9-26 21:21:59 | 显示全部楼层
没有文件,所以实测不了,模拟了一下

将b文件重复复制成10万5000行,A文件数据使用了楼主给出的内容,实测全 ...
annybaby 发表于 2013-9-26 15:50



不好意思,求思路,刚回来,测试文本已上传。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2013-9-26 22:15:04 | 显示全部楼层
回复 8# dtooboss



没有细看你文件的内容,下载下来直接F5的,你看一下是不是你需要的

总用时是2秒多(我的是07年的老爷机,你的机子应该可以700毫秒)

2206.4619999975
请按任意键继续. . .

PS:使用了hash表和字符串拆分来做

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2013-9-26 22:39:31 | 显示全部楼层
回复 9# annybaby
果然……高阶。
请问能否指教一下实现方法?
 楼主| 发表于 2013-9-27 02:38:25 | 显示全部楼层
回复  dtooboss



没有细看你文件的内容,下载下来直接F5的,你看一下是不是你需要的

总用时是2秒多 ...
annybaby 发表于 2013-9-26 22:15


真是大神呀~~~,求实现方法~。
谢谢了~~
发表于 2013-9-27 07:24:42 | 显示全部楼层
回复 11# dtooboss

前面已经说了,是用了hash表和字符串拆分,其中hash表在AU3中是assign和isdeclared,字符串拆分你当然是懂的...
我使用的工具不是au3,但那是因为我对另外一个工具更熟悉些(好长一段时间没用AU3了),虽然它的执行效率是会比AU3高一些,但你也可以想像,两者相差绝不可能会是2秒和6小时的差别!
AU3来做的话,应该在35秒左右吧
你可以参看论坛一些朋友有关assign相关的使用代码
 楼主| 发表于 2013-9-27 08:20:26 | 显示全部楼层
回复  dtooboss

前面已经说了,是用了hash表和字符串拆分,其中hash表在AU3中是assign和isdeclared,字符串 ...
annybaby 发表于 2013-9-27 07:24


虽然不会hash,对assign函数也没用过,还是谢谢你了。能否贴下其他工具的主要源码?
发表于 2013-9-27 08:26:16 | 显示全部楼层
回复 13# dtooboss

已经发私信了..
 楼主| 发表于 2013-9-27 08:31:08 | 显示全部楼层
回复  dtooboss

已经发私信了..
annybaby 发表于 2013-9-27 08:26


十分感谢~~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-28 21:21 , Processed in 0.095406 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表