文本对比的效率算法【已解决】
本帖最后由 骗子 于 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
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
晕,Notepad++ 插件就带这功能。。 Notepad++ 插件管理,添加 compare 插件。 回复 1# 骗子
assign和Isdeclared.. 回复 4# annybaby
??文件对比能用assign?怎么用? Notepad++ 插件管理,添加 compare 插件。
MicroBlue 发表于 2012-12-10 12:29 http://www.autoitx.com/images/common/back.gif
没用过Notepad++ ,现在的目的是想已AU3的方式来实现此项功能,有一个易语言的软件不到2秒就搞定了 回复骗子
assign和Isdeclared..
annybaby 发表于 2012-12-10 12:36 http://www.autoitx.com/images/common/back.gif
基础太差,拿了之论坛保存下来的单个文本去重的代码弄了半天也没弄出来个结果 没用过Notepad++ ,现在的目的是想已AU3的方式来实现此项功能,有一个易语言的软件不到2秒就搞定了
骗子 发表于 2012-12-10 14:16 http://www.autoitx.com/images/common/back.gif
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))
回复 5# netegg
刚刚在帮人写脚本~~~
将A,B文件读入到数组(或者正则匹配返回来的全局数组),以A数组元素的内容为变量赋值,然后以B数组元素来判断是否为已声明,如果是,表明它在A文件中,否则不在~~ 回复 7# 骗子
你那个效率也太差了吧??都过了十几分钟,还没完成十分之一`~
我还以为我的电脑死机了呢,刷新看了一下输入的文件大小有变化,才知道原来没死~
{:face (245):} 回复骗子
你那个效率也太差了吧??都过了十几分钟,还没完成十分之一`~
我还以为我的电脑死机了呢,刷新 ...
annybaby 发表于 2012-12-10 15:23 http://www.autoitx.com/images/common/back.gif
就是因为效率差才求助的啊,主要是B有多少行就要比对多少次, StringInStr($Atxt, $barray[$I]) ,$ATXT又太大,比对就耗时间,先对来讲每次写一行和放到一个文件里一起写对速度的影响差异就不太大了 回复 8# afan
A大,我这里F5好像有点问题`~
出来好多乱码~ Au3 1秒完成
afan 发表于 2012-12-10 15:20 http://www.autoitx.com/images/common/back.gif
谢谢 ,一直没弄明白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
Assign($A[$I], 1)
Next
$CHONGFU = ''
$BUCHONGFU = ''
For $I = 1 To $B
If IsDeclared($B[$I]) Then
$CHONGFU &= $B[$I] & @CRLF
Else
$BUCHONGFU &= $B[$I] & @CRLF
EndIf
Next
FileWrite('C.TXT', $BUCHONGFU)
FileWrite('A中已包含.txt', $CHONGFU)
回复afan
A大,我这里F5好像有点问题`~
出来好多乱码~
annybaby 发表于 2012-12-10 16:07 http://www.autoitx.com/images/common/back.gif
我这完全正常哦 Xp sp3(x86) Au3 3.3.6.1 回复 14# afan
原来是我的文本查看器问题,我关联的txt是Akelpad,用记事本看OK了~~
也的确有些奇怪~
assign用于去重的确是高效,不过就是如果不重的数据量巨大的话,容易造成堆栈溢出,不知道有没有好办法改善之??