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 )
改为直接删除重复行的