找回密码
 加入
搜索
楼主: nbmpe

[AU3基础] 删除重复行,为什么速度慢,帮看下代码(已解决)

 火... [复制链接]
发表于 2010-11-14 11:43:24 | 显示全部楼层
谢谢分享!!学习中!!
发表于 2010-11-14 12:39:32 | 显示全部楼层
回复 41# afan


   要删除所有重复行,又要效率,那肯定是要对数组进行排序,找出重复的数组元素,得到这些重复元

素的位置,其他操作都建立在此基础之上。而数组可以通过多种方式得到,我用的就是正则提取。

小文件处理看不出差别,但是如果文件像楼主说的30M,甚至更大,上百兆。想要删除所有的重复行,

处理方式的差别就显而易见了
 楼主| 发表于 2010-11-14 12:46:39 | 显示全部楼层
在同一台电脑上,100K的内容,内容为
AAA AAA AAA
BBB BBB BBB
CCC CCC CCC
DDD DDD EEE
FFF FFF FFF
3mile 兄19楼的代码用6S
     27楼的代码用1.7S   高效率呀

都很强,收下研究一下思想,代码效率都超过了批处理,下面是我的代码,上面一个用了14秒,批处理用了10秒.
#include <File.au3>
$aFile = "1.txt"
$bFile = "t.txt"
$begin = TimerInit()
For $i = _FileCountLines($aFile) to 1 Step -1

        ;$x = FileReadLine($aFile, $i)
               ; If $i = _FileCountLines($aFile) Then  FileWriteLine($bFile,$x)
        If Not IsDeclared(FileReadLine($aFile, $i)) Then 
                Assign(FileReadLine($aFile, $i),FileReadLine($aFile, $i))
                FileWriteLine($bFile,FileReadLine($aFile, $i))
        EndIf        
                
Next
$dif = TimerDiff($begin)
MsgBox(0, 0,$dif/1000)
$begin = TimerInit()
RunWait('2.BAT')
$dif = TimerDiff($begin)
MsgBox(0, 0,$dif/1000)
发表于 2010-11-14 12:47:36 | 显示全部楼层
回复 47# binghc


    就以LZ的要求,创建一个1000次重复的文件作测试吧~
Local $Str = _
                'AAA BBB ' & @CRLF & _
                'CCC AAA' & @CRLF & _
                'AB AB AC' & @CRLF & _
                'ABCDE AAA' & @CRLF
Local $StrAll = ''
For $i = 1 To 1000
        $StrAll &= $Str
Next
FileWrite('1000组重复.txt', $StrAll)
发表于 2010-11-14 13:46:29 | 显示全部楼层
把文件按行倒入数据库 然后用distinct读出来 不知道效率怎么样
我电脑WIN7 4连ACCESS有点问题 32位的童鞋可以试试
发表于 2010-11-14 13:56:30 | 显示全部楼层
题外话,AU3支持字典不,我用其他语言(VBA)写了个测试,利用字典,只用了0.125秒,字典去重复效率很高,不知AU3是否支持。
发表于 2010-11-14 14:30:13 | 显示全部楼层
来看看````学习一下
发表于 2010-11-14 15:14:14 | 显示全部楼层
看看什么东东。
 楼主| 发表于 2010-11-14 16:31:38 | 显示全部楼层
回复 50# 大绯狼
字典我不会用,把你的VB代码贴出来,回来给我另一同事研究下,我只会点AU3。
发表于 2010-11-14 18:52:06 | 显示全部楼层
Sub test()
Dim FSO As Object, TXT As Object, Dic As Object, Str, Arr, N&, mTime
mTime = Timer
Set Dic = CreateObject("scripting.dictionary")
Set FSO = CreateObject("scripting.filesystemobject")
Set TXT = FSO.opentextfile(ThisWorkbook.Path & "\萌动校园.txt")
Do While Not TXT.atendofstream
    Str = TXT.readline
    If Str <> "" And Not Dic.exists(Str) Then Dic(Str) = ""
Loop
TXT.Close
Arr = Dic.keys
Set Dic = Nothing
Open ThisWorkbook.Path & "\萌动校园2.txt" For Output As #1
For N = LBound(Arr) To UBound(Arr)
    Print #1, Arr(N)
Next N
Close #1
Set TXT = Nothing
Set FSO = Nothing
Debug.Print Format(Timer - mTime, "0.00000秒")
End Sub
这个是vba代码,字典项目也是创建的,不知au3里现在包含这个项目了没?
发表于 2010-11-14 18:53:52 | 显示全部楼层
回复 54# nbmpe
何必用字典,就是你的方法稍微优化一下即可。
#include <File.au3>

Local $Str = _
                'AAA BBB ' & @CRLF & _
                'CCC AAA' & @CRLF & _
                'AB AB AC' & @CRLF & _
                'ABCDE AAA' & @CRLF
Local $StrAll = ''
For $i = 1 To 1000
        $StrAll &= $Str
Next
FileWrite('1000组重复.txt', $StrAll)

$begin = TimerInit()
$aFile = "1000组重复.txt"
Local $str='',$file_array
_FileReadToArray($aFile,$file_array)
For $i = 1 To UBound($file_array)-1
        $temp=$file_array[$i]
        If Not IsDeclared($temp) Then
                Assign($temp, $i)                
                $str&=$temp&@CRLF
        EndIf
Next
$dif = TimerDiff($begin)
MsgBox(0, $dif,$str)
发表于 2010-11-14 19:01:27 | 显示全部楼层
如果只是删除相邻行,用正则应该效率不差。
Local $Str = _
                '本书由TXT小说电子书下载网站http://www.txtbook.com.cn提供.' & @CRLF & _
                '本书由TXT小说电子书下载网站http://www.txtbook.com.cn提供.' & @CRLF & _
                '本书由TXT小说电子书下载网站http://www.txtbook.com.cn提供.' & @CRLF & _
                '声明:本书仅供读者预览,请在下载24小时内删除,不得用作商业用途;如果喜欢请购买正版图书!' & @CRLF & _
                '本书由TXT小说电子书下载网站http://www.txtbook.com.cn提供.' & @CRLF & _
                '1.推荐使用TXTBOOK Reader 电子书阅读器V3.1阅读电子书,下载地址:http://www.txtbook.com.cn/reader/'
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExpReplace($str, '(.*?\n)\1+', '$1')
MsgBox(0, '替换结果', $Test)
发表于 2010-11-15 02:33:42 | 显示全部楼层
学习学习了
发表于 2010-11-15 11:26:52 | 显示全部楼层
呵呵学习一下。。
 楼主| 发表于 2010-11-15 16:23:46 | 显示全部楼层
56 楼代码实在精简, 效率超高, 30M内容只用了10秒! 思想也简单,可以稍改一下,
FileDelete($aFile)
FileWrite($aFile,$str )
改为直接删除重复行的
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-24 12:59 , Processed in 0.083635 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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