骗子 发表于 2012-7-16 12:06:19

文本重复行标注,求优化[已解决]

本帖最后由 骗子 于 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

xms77 发表于 2012-7-16 12:36:42

我也只会死方法,正则不会,坐等A大来解答!

user3000 发表于 2012-7-16 14:06:21

本帖最后由 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

kevinch 发表于 2012-7-16 17:35:35

#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 17:52:48

本帖最后由 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

xiaowo 发表于 2012-7-17 08:17:49

整行与整行比较,第一感觉是不需要用正则的

LS各位的代码学习了

binghc 发表于 2012-7-17 22:10:29

回复 5# 3mile

au3能自己写个类么?{:face (254):}

3mile 发表于 2012-7-18 10:03:59

回复 7# binghc
http://www.autoitscript.com/forum/files/file/177-autoitobject/

binghc 发表于 2012-7-18 10:44:14

回复 8# 3mile


    还真行啊!用面向对象的方式写比较复杂的程序会方便很多,有空好好研究研究{:face (301):}

骗子 发表于 2012-7-18 12:50:23

本帖最后由 骗子 于 2012-7-18 13:01 编辑

谢谢各位,因为有点事情一直没上网,所以现在才看到各位的回复。谢谢了

chamlien 发表于 2016-3-9 17:38:13

回复标记,刚好需要
页: [1]
查看完整版本: 文本重复行标注,求优化[已解决]