masterpcc 发表于 2010-11-14 11:43:24

谢谢分享!!学习中!!

binghc 发表于 2010-11-14 12:39:32

回复 41# afan


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

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

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

处理方式的差别就显而易见了

nbmpe 发表于 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) ThenFileWriteLine($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)

afan 发表于 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位的童鞋可以试试

kevinch 发表于 2010-11-14 13:56:30

题外话,AU3支持字典不,我用其他语言(VBA)写了个测试,利用字典,只用了0.125秒,字典去重复效率很高,不知AU3是否支持。

gxbeiliu2008 发表于 2010-11-14 14:30:13

来看看````学习一下

mexiaoyuoo 发表于 2010-11-14 15:14:14

看看什么东东。

nbmpe 发表于 2010-11-14 16:31:38

回复 50# 大绯狼
字典我不会用,把你的VB代码贴出来,回来给我另一同事研究下,我只会点AU3。

kevinch 发表于 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里现在包含这个项目了没?

3mile 发表于 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)

3mile 发表于 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)

cutyourchicken 发表于 2010-11-15 02:33:42

学习学习了

menfan1 发表于 2010-11-15 11:26:52

呵呵学习一下。。

nbmpe 发表于 2010-11-15 16:23:46

56 楼代码实在精简, 效率超高, 30M内容只用了10秒! 思想也简单,可以稍改一下,
FileDelete($aFile)
FileWrite($aFile,$str )
改为直接删除重复行的
页: 1 2 3 [4] 5 6 7 8
查看完整版本: 删除重复行,为什么速度慢,帮看下代码(已解决)