骗子 发表于 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
        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



MicroBlue 发表于 2012-12-10 12:27:40

晕,Notepad++ 插件就带这功能。。

MicroBlue 发表于 2012-12-10 12:29:36

Notepad++ 插件管理,添加 compare 插件。

annybaby 发表于 2012-12-10 12:36:39

回复 1# 骗子

assign和Isdeclared..

netegg 发表于 2012-12-10 12:58:24

回复 4# annybaby
??文件对比能用assign?怎么用?

骗子 发表于 2012-12-10 14:16:52

Notepad++ 插件管理,添加 compare 插件。
MicroBlue 发表于 2012-12-10 12:29 http://www.autoitx.com/images/common/back.gif
没用过Notepad++ ,现在的目的是想已AU3的方式来实现此项功能,有一个易语言的软件不到2秒就搞定了

骗子 发表于 2012-12-10 14:18:29

回复骗子

assign和Isdeclared..
annybaby 发表于 2012-12-10 12:36 http://www.autoitx.com/images/common/back.gif

基础太差,拿了之论坛保存下来的单个文本去重的代码弄了半天也没弄出来个结果

afan 发表于 2012-12-10 15:20:45

没用过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))

annybaby 发表于 2012-12-10 15:22:08

回复 5# netegg

刚刚在帮人写脚本~~~

将A,B文件读入到数组(或者正则匹配返回来的全局数组),以A数组元素的内容为变量赋值,然后以B数组元素来判断是否为已声明,如果是,表明它在A文件中,否则不在~~

annybaby 发表于 2012-12-10 15:23:53

回复 7# 骗子

你那个效率也太差了吧??都过了十几分钟,还没完成十分之一`~
我还以为我的电脑死机了呢,刷新看了一下输入的文件大小有变化,才知道原来没死~
{:face (245):}

骗子 发表于 2012-12-10 15:55:20

回复骗子

你那个效率也太差了吧??都过了十几分钟,还没完成十分之一`~
我还以为我的电脑死机了呢,刷新 ...
annybaby 发表于 2012-12-10 15:23 http://www.autoitx.com/images/common/back.gif
就是因为效率差才求助的啊,主要是B有多少行就要比对多少次, StringInStr($Atxt, $barray[$I]) ,$ATXT又太大,比对就耗时间,先对来讲每次写一行和放到一个文件里一起写对速度的影响差异就不太大了

annybaby 发表于 2012-12-10 16:07:23

回复 8# afan

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

出来好多乱码~

骗子 发表于 2012-12-10 16:07:39

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 发表于 2012-12-10 16:12:16

回复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

annybaby 发表于 2012-12-10 16:49:23

回复 14# afan

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

assign用于去重的确是高效,不过就是如果不重的数据量巨大的话,容易造成堆栈溢出,不知道有没有好办法改善之??
页: [1] 2 3
查看完整版本: 文本对比的效率算法【已解决】