找回密码
 加入
搜索
查看: 25601|回复: 33

[效率算法] 文本对比的效率算法【已解决】

 火.. [复制链接]
发表于 2012-12-10 12:12:20 | 显示全部楼层 |阅读模式
本帖最后由 骗子 于 2012-12-10 18:08 编辑

已解决,代码请看8楼A大的代码
谢谢各位
A,B两个非常大的文件,A有几十W行,B几万行,想通过软件对这两个文件进行比对,判断B的每行的内容在A里面是否已经有了,如果有的话就写入A中已包含.txt,如果没有的话就写入Ctxt
自己写了个程序,速度惨不忍睹,求各位兄弟姐妹帮忙相隔速度一点的方法,谢谢了

#include <file.au3>
#include <array.au3>
Local $barray
_FileReadToArray('B.txt', $barray)
$Atxt = FileRead('A.TXT')
FileDelete('C.TXT')
For $I = 1 To $barray[0]
        ToolTip('比对进行中,目前比对到第' & $I & '行', 10, 10)
        If StringInStr($Atxt, $barray[$I]) Then
                FileWrite('A中已包含.txt', $barray[$I] & @CRLF)
        Else
                FileWrite('c.txt', $barray[$I] & @CRLF)
        EndIf
Next



本帖子中包含更多资源

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

×
发表于 2012-12-10 12:27:40 | 显示全部楼层
晕,Notepad++ 插件就带这功能。。
发表于 2012-12-10 12:29:36 | 显示全部楼层
Notepad++ 插件管理,添加 compare 插件。
发表于 2012-12-10 12:36:39 | 显示全部楼层
回复 1# 骗子

assign和Isdeclared..
发表于 2012-12-10 12:58:24 | 显示全部楼层
回复 4# annybaby
??文件对比能用assign?怎么用?
 楼主| 发表于 2012-12-10 14:16:52 | 显示全部楼层
Notepad++ 插件管理,添加 compare 插件。
MicroBlue 发表于 2012-12-10 12:29

没用过Notepad++ ,现在的目的是想已AU3的方式来实现此项功能,有一个易语言的软件不到2秒就搞定了
 楼主| 发表于 2012-12-10 14:18:29 | 显示全部楼层
回复  骗子

assign和Isdeclared..
annybaby 发表于 2012-12-10 12:36


基础太差,拿了之论坛保存下来的单个文本去重的代码弄了半天也没弄出来个结果
发表于 2012-12-10 15:20:45 | 显示全部楼层
没用过Notepad++ ,现在的目的是想已AU3的方式来实现此项功能,有一个易语言的软件不到2秒就搞定了
骗子 发表于 2012-12-10 14:16



    Au3 1秒完成
Local $sA = FileRead('A.txt'), $sB = FileRead('B.txt')
Local $File1 = 'A中已包含.txt', $File2 = 'C.txt'
Local $ts = TimerInit(), $sFile1 = '', $sFile2 = ''

$sA = StringReplace($sA, '[', '{          }')
Local $aA = StringRegExp($sA, '\V+', 3)
If @error Then Exit 1
For $i = 0 To UBound($aA) - 1
        $ss = Assign('~' & $aA[$i], 1)
Next

$sB0 = StringReplace($sB, '[', '{          }')
Local $aB0 = StringRegExp($sB0, '\V+', 3)
If @error Then Exit 2
Local $aB = StringRegExp($sB, '\V+', 3)
If @error Then Exit 3

$File1 = FileOpen($File1, 10)
$File2 = FileOpen($File2, 10 + 128)
For $i = 0 To UBound($aB) - 1
        If IsDeclared('~' & $aB0[$i]) Then
                $sFile1 &= $aB[$i] & @CRLF
        Else
                $sFile2 &= $aB[$i] & @CRLF
        EndIf
Next
FileWrite($File1, $sFile1)
FileClose($File1)
FileWrite($File2, $sFile2)
FileClose($File2)

MsgBox(64, '完成', '耗时:' & TimerDiff($ts))

评分

参与人数 3金钱 +68 收起 理由
小凯 + 18 学习了.原来还可以这样弄!
xms77 + 30 学习了Assign和IsDeclared
annybaby + 20 看法相同~~

查看全部评分

发表于 2012-12-10 15:22:08 | 显示全部楼层
回复 5# netegg

刚刚在帮人写脚本~~~

将A,B文件读入到数组(或者正则匹配返回来的全局数组),以A数组元素的内容为变量赋值,然后以B数组元素来判断是否为已声明,如果是,表明它在A文件中,否则不在~~
发表于 2012-12-10 15:23:53 | 显示全部楼层
回复 7# 骗子

你那个效率也太差了吧??都过了十几分钟,还没完成十分之一`~
我还以为我的电脑死机了呢,刷新看了一下输入的文件大小有变化,才知道原来没死~
 楼主| 发表于 2012-12-10 15:55:20 | 显示全部楼层
回复  骗子

你那个效率也太差了吧??都过了十几分钟,还没完成十分之一`~
我还以为我的电脑死机了呢,刷新 ...
annybaby 发表于 2012-12-10 15:23

就是因为效率差才求助的啊,主要是B有多少行就要比对多少次, StringInStr($Atxt, $barray[$I]) ,$ATXT又太大,比对就耗时间,先对来讲每次写一行和放到一个文件里一起写对速度的影响差异就不太大了
发表于 2012-12-10 16:07:23 | 显示全部楼层
回复 8# afan

A大,我这里F5好像有点问题`~

出来好多乱码~
 楼主| 发表于 2012-12-10 16:07:39 | 显示全部楼层
Au3 1秒完成
afan 发表于 2012-12-10 15:20

谢谢 ,一直没弄明白Assign到底是怎么用,刚才东拼西凑出来下面的内容,但是结果确实错误的,重复文件里的内容为空。
看了你的脚本试着把A,B里的 [替换了好像才行

#include <file.au3>
#include <array.au3>
Local $A, $B
FileDelete('C.TXT')
FileDelete('A中已包含.txt')
_FileReadToArray('A1.TXT', $A)
_FileReadToArray('B1.TXT', $B)
For $I = 1 To $A[0]
        Assign($A[$I], 1)
Next
$CHONGFU = ''
$BUCHONGFU = ''
For $I = 1 To $B[0]
        If IsDeclared($B[$I]) Then
                $CHONGFU &= $B[$I] & @CRLF
        Else
                $BUCHONGFU &= $B[$I] & @CRLF
        EndIf
Next
FileWrite('C.TXT', $BUCHONGFU)
FileWrite('A中已包含.txt', $CHONGFU)
发表于 2012-12-10 16:12:16 | 显示全部楼层
回复  afan

A大,我这里F5好像有点问题`~

出来好多乱码~
annybaby 发表于 2012-12-10 16:07



    我这完全正常哦 Xp sp3(x86) Au3 3.3.6.1
发表于 2012-12-10 16:49:23 | 显示全部楼层
回复 14# afan

原来是我的文本查看器问题,我关联的txt是Akelpad,用记事本看OK了~~
也的确有些奇怪~

assign用于去重的确是高效,不过就是如果不重的数据量巨大的话,容易造成堆栈溢出,不知道有没有好办法改善之??
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 12:50 , Processed in 0.087829 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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