找回密码
 加入
搜索
查看: 5841|回复: 10

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

  [复制链接]
发表于 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[0]
                $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
发表于 2012-7-16 12:36:42 | 显示全部楼层
我也只会死方法,正则不会,坐等A大来解答!
发表于 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[0]] & '  此文字有重复行: '
                        For $j = 0 To UBound($indexs) - 1
                                $result &= $indexs[$j] & ' '
                        Next
                        $result &= @CRLF
                EndIf
        Next
        FileWrite('重复检查结果.txt', $result)
        ShellExecute('重复检查结果.txt')
EndFunc   ;==>_chongfujiancha

评分

参与人数 1金钱 +10 收起 理由
骗子 + 10 331秒,源文件于4、5的一样。显示结果挺好

查看全部评分

发表于 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
借楼上代码一用,楼主可以试下
发表于 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[UBound($aArray)]

        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][0]) Then
                                $oD.Add($aArray[$i][0], 0)
                                $aUnique[$j][0] = $aArray[$i][0]
                                $aUnique[$j][1] = $aArray[$i][1]
                                $j += 1
                        Else
                                If Not $oD.item($aArray[$i][0]) = $aArray[$i][1] Then $aUnique[$j - 1][1] = $aArray[$i][1]
                        EndIf
                Next
                ReDim $aUnique[$j][2]
        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

评分

参与人数 1金钱 +30 收起 理由
binghc + 30 还用对象了,au3对象完全不懂,不知效率咋样 ...

查看全部评分

发表于 2012-7-17 08:17:49 | 显示全部楼层
整行与整行比较,第一感觉是不需要用正则的

LS各位的代码学习了
发表于 2012-7-17 22:10:29 | 显示全部楼层
回复 5# 3mile

au3能自己写个类么?
发表于 2012-7-18 10:03:59 | 显示全部楼层

评分

参与人数 1贡献 +5 收起 理由
binghc + 5 au3能写面向对象的代码,不错,尽管看上去好 ...

查看全部评分

发表于 2012-7-18 10:44:14 | 显示全部楼层
回复 8# 3mile


    还真行啊!用面向对象的方式写比较复杂的程序会方便很多,有空好好研究研究
 楼主| 发表于 2012-7-18 12:50:23 | 显示全部楼层
本帖最后由 骗子 于 2012-7-18 13:01 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-3-9 17:38:13 | 显示全部楼层
回复标记,刚好需要
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-26 10:26 , Processed in 0.110535 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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