骗子 发表于 2012-12-10 16:53:09

WIN7 3.3.9.4正常

afan 发表于 2012-12-10 17:01:31

回复 15# annybaby


    没试过数据量巨大的情况,如此的话可能需要分段处理…

annybaby 发表于 2012-12-10 17:02:25

回复 16# 骗子

嗯,是的,代码没有问题,是我的文本查看器的小问题~~

assign和IsDeclared用于去重还是很好用的,方便,高效,代码简单,可惜就是堆栈的大小不知道怎么改,如果你的不重复数据超过30万(也就是需要声明的变量个数超30万)就会造成堆栈溢出错误,可能还与具体的系统有一点关系,我的机子超过288288就铁定会出错~~

afan 发表于 2012-12-10 17:04:45

谢谢 ,一直没弄明白Assign到底是怎么用,刚才东拼西凑出来下面的内容,但是结果确实错误的,重复文件里的 ...
骗子 发表于 2012-12-10 16:07 http://www.autoitx.com/images/common/back.gif


    Assign声明需要赋值的变量名. 不能是数组元素.需要预处理“[”
另外不要直接FileWrite文件,因为你的“B.txt”是UTF8格式。

annybaby 发表于 2012-12-10 17:12:52

回复 19# afan

哈哈,A大,不知道你自己有没有试过
其实,虽然文档里说assign赋值的变量名不能是一个数组元素,但你试一下,其实是可以的哦!~

afan 发表于 2012-12-10 17:16:20

回复 20# annybaby


    以前就试过了,不行的。 具体说“变量名不能是一个数组元素”其实是指不能包含含有“[]”的字符串。
不信你可以自己试试。

annybaby 发表于 2012-12-10 17:31:31

回复 21# afan

原来是指这个,我的意思是:
这个帖子里,3mile前辈那个赋值给$temp变量的操作其实是没有必要的~~

annybaby 发表于 2012-12-10 18:32:42

本帖最后由 annybaby 于 2012-12-10 18:57 编辑

回复 8# afan






+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
重新编辑此帖,以免后来看到的朋友会被误导,说明下:
虽然这样的确可以提高效率,但可靠性被降低,除非你确定脚本中其它的变量定义不会影响到你的最终结果并且非常强调效率,否则不建议这样做,原因楼下A大已经有说明了~
{:face (125):}

afan 发表于 2012-12-10 18:41:50

回复 23# annybaby


    呵呵,这个主要是预防和你的脚本里的变量同名。比如如果你是这样的申明
Local $abc = xxx

而 B.txt 中刚好有 “abc”这一行,那么恭喜你,就算 “A.txt”中没有这一行,它仍将被载入“A中已包含.txt”……

加“~”是因为常规的 $~abc 是错误的,而这正好起了规避的作用。

annybaby 发表于 2012-12-10 18:51:22

回复 24# afan

高!!!
怪不得以前看P版的代码会看到加了这个东东~~一直想不明白为什么要加个多余反而会降低效率的前缀

双学到一招!!{:face (411):}

骗子 发表于 2012-12-11 10:02:00

回复 24# afan
学习了,谢谢

xms77 发表于 2012-12-11 12:18:21

回复 19# afan
请问A大,怎么知道B.txt是UTF-8的格式?

afan 发表于 2012-12-11 12:29:04

回复 27# xms77


    一般有 BOM 标记的用 FileGetEncoding() 就知道了,128 = UTF-8

小凯 发表于 2012-12-15 16:42:42

Au3 1秒完成
afan 发表于 2012-12-10 15:20 http://www.autoitx.com/images/common/back.gif
收藏一下!!!{:face (355):}

seeyou 发表于 2012-12-16 22:36:17

贴一个时间复杂度高一点点的,但不到2m


#include <Array.au3>
#include <File.au3>

Global $arrayA, $arrayB
Global $dic = ObjCreate("Scripting.Dictionary")
Global $strAinc = "", $strADiff = ""
$foutInc = FileOpen("AI.txt", 2)
$foutDiff = FileOpen("C.txt", 2)

$stime = TimerInit()
_FileReadToArray("A.txt", $arrayA)
_FileReadToArray("B.txt", $arrayB)

For $index = 1 To $arrayA
    $dic.Add($arrayA[$index], 1)
Next

For $index = 1 To $arrayB
    If($dic.Exists($arrayB[$index]))then
      $strAinc &= $arrayB[$index]&@CRLF
    Else
      $strADiff &= $arrayB[$index]&@CRLF
    EndIf
Next

FileWrite($foutInc, $strAinc)
FileWrite($foutDiff, $strADiff)
FileClose($foutInc)
FileClose($foutDiff)

$etime = TimerDiff($stime)
MsgBox(64, "耗时", $etime)
页: 1 [2] 3
查看完整版本: 文本对比的效率算法【已解决】