文本重复行标注,求优化[已解决]
本帖最后由 骗子 于 2012-8-13 21:05 编辑正则几乎不懂,就只能用笨办法去一个一个的比较。效率实在是成问题,300多K的文件就要20多秒。
#include <File.au3>
#include <array.au3>
$begin = TimerInit()
_chongfujiancha("1818901.txt")
$dif = TimerDiff($begin)
MsgBox(0,"时间差,这个计时的精度比sleep高",$dif)
Func _chongfujiancha($wenb)
FileDelete('重复检查结果.txt')
Dim $arr1, $arr2
_FileReadToArray($wenb, $arr1)
_FileReadToArray($wenb, $arr2)
For $i = 1 To $arr2
$xxx = $arr2[$i]
$asd = ""
$aiResult = _ArrayFindAll($arr1, $xxx)
If UBound($aiResult) > 1 Then
For $j = 0 To UBound($aiResult) - 1
If $i <> $aiResult[$j] Then
$arr2[$aiResult[$j]] =$aiResult[$j]& "行与" & $i & "行相同 ----" & $arr2[$aiResult[$j]]
EndIf
Next
EndIf
Next
FileWrite('重复检查结果.txt', _ArrayToString($arr2, @CRLF) & @CRLF)
_FileWriteToLine('重复检查结果.txt', 1, "", 1)
ShellExecute('重复检查结果.txt')
EndFunc ;==>_chongfujiancha
我也只会死方法,正则不会,坐等A大来解答! 本帖最后由 user3000 于 2012-7-16 18:07 编辑
回复 1# 骗子
我想不出如何用正则确定特定文本的行数值了.
修改了1楼的代码, 没有文本测试, 未知效率提高否?
#include <File.au3>
#include <array.au3>
$begin = TimerInit()
_chongfujiancha("test.txt")
$dif = TimerDiff($begin)
MsgBox(0, "时间差,这个计时的精度比sleep高", $dif)
Func _chongfujiancha($wenb)
FileDelete('重复检查结果.txt')
Local $arr1, $arr2
Local $result = ""
;_FileReadToArray($wenb, $arr1)
; 看到六楼的三笑老大的代码,才知道上面这句代码实在是多余!
_FileReadToArray($wenb, $arr2)
$arr1 = _ArrayUnique($arr2, 1, 1)
For $i = 1 To UBound($arr1) - 1
$indexs = _ArrayFindAll($arr2, $arr1[$i], 1)
If UBound($indexs) > 1 Then
$result &= $arr2[$indexs] & '此文字有重复行: '
For $j = 0 To UBound($indexs) - 1
$result &= $indexs[$j] & ' '
Next
$result &= @CRLF
EndIf
Next
FileWrite('重复检查结果.txt', $result)
ShellExecute('重复检查结果.txt')
EndFunc ;==>_chongfujiancha #include <File.au3>
#include <array.au3>
$begin = TimerInit()
_chongfujiancha("result.txt")
$dif = TimerDiff($begin)
MsgBox(0, "时间差,这个计时的精度比sleep高", $dif)
Func _chongfujiancha($wenb)
Local $arr,$result="",$dic=ObjCreate("scripting.dictionary")
FileDelete('重复检查结果.txt')
_FileReadToArray($wenb, $arr)
For $i = 0 To UBound($arr) - 1
If StringStripWS($arr[$i],8)<>"" Then
If $dic.exists($arr[$i]) Then
$arr[$i]&='--> 此文字有重复行'
Else
$dic($arr[$i])=""
EndIf
EndIf
$result&=$arr[$i]&@CRLF
Next
FileWrite('重复检查结果.txt', $result)
ShellExecute('重复检查结果.txt')
EndFunc ;==>_chongfujiancha借楼上代码一用,楼主可以试下 本帖最后由 3mile 于 2012-7-16 19:40 编辑
#include <File.au3>
#include <array.au3>
$begin = TimerInit()
Local $arr
_FileReadToArray("1818901.txt", $arr)
$new_arr = ArrayUnique($arr)
FileWrite('重复检查结果.txt', _ArrayToString($new_arr, @CRLF) & @CRLF)
ShellExecute('重复检查结果.txt')
$dif = TimerDiff($begin)
MsgBox(0, "时间差,这个计时的精度比sleep高", $dif)
Func ArrayUnique($aArray, $iBase = 0, $oBase = 0, $iCase = 0)
If Not IsArray($aArray) Then Return SetError(1, 0, 0)
If UBound($aArray, 0) > 2 Then Return SetError(2, 0, 0)
Local $oD = ObjCreate('Scripting.Dictionary')
If @error Then Return SetError(4, 0, 0)
Local $dim2 = UBound($aArray, 2)
Local $temp
If $dim2 Then ;2D array
Local $dim1 = UBound($aArray, 1), $aUnique[$dim1][$dim2], $j
For $i = 0 To $dim1 - 1
If Not $oD.Exists($aArray[$i]) Then
$oD.Add($aArray[$i], 0)
$aUnique[$j] = $aArray[$i]
$aUnique[$j] = $aArray[$i]
$j += 1
Else
If Not $oD.item($aArray[$i]) = $aArray[$i] Then $aUnique[$j - 1] = $aArray[$i]
EndIf
Next
ReDim $aUnique[$j]
Else ;1D array
For $i = 1 To UBound($aArray) - 1
If Not $oD.Exists($aArray[$i]) Then
$oD.Add($aArray[$i], $i)
$temp[$i] = $aArray[$i]
Else
$temp[$i] = $i & "行与" & $oD.item($aArray[$i]) & "行相同 ----" & $aArray[$i]
EndIf
Next
Local $aUnique = $oD.Keys()
EndIf
$oD.RemoveAll
$oD = ""
Return $temp
EndFunc ;==>ArrayUnique
整行与整行比较,第一感觉是不需要用正则的
LS各位的代码学习了 回复 5# 3mile
au3能自己写个类么?{:face (254):} 回复 7# binghc
http://www.autoitscript.com/forum/files/file/177-autoitobject/ 回复 8# 3mile
还真行啊!用面向对象的方式写比较复杂的程序会方便很多,有空好好研究研究{:face (301):} 本帖最后由 骗子 于 2012-7-18 13:01 编辑
谢谢各位,因为有点事情一直没上网,所以现在才看到各位的回复。谢谢了 回复标记,刚好需要
页:
[1]