找回密码
 加入
搜索
楼主: kood481748

[AU3基础] 用AU3怎样删除ini配置文件中重复的行?

 火... [复制链接]
 楼主| 发表于 2011-3-14 11:16:44 | 显示全部楼层
看来删除文本文件中的重复行的方法还真多啊,感谢各位仙人在此各显神通
面具人老师的代码是目前到16楼为止,速度最快,质量最高的代码
请问下你的代码能不能把已删除的行保存在另一个文件中?就像12楼那样
发表于 2011-3-14 11:50:26 | 显示全部楼层
借用水木子的思路 我用了0.006毫秒
$sText = "key=白骨精他妈" & @CRLF & _
                "key=沙和尚" & @CRLF & _
                "key=白骨" & @CRLF & _
                "key=孙悟空" & @CRLF & _
                "key=沙和尚" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨精" & @CRLF & _
                "key=白骨" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨精" & @CRLF & _
                "key=白骨精他妈" & @CRLF & _
                "key=孙悟空"
$time=TimerInit()
MsgBox(0,Round(TimerDiff($time),5)&"毫秒", jj($sText))
Func jj($Text)
        $sRer = StringRegExpReplace($Text, "(?m)(key=.+)(?=[^\1]+\1$)", "")
        $sRer = StringRegExpReplace($sRer, '^\v+|\r?\n(?=\r?\n)|\r?\n$', '')
        $sr = StringRegExp($sRer, "(key=.+)(?=[^\1]+\1\v)", 3)
        If Not @error Then
                jj($sRer)
        Else
                Return $sRer
        EndIf
EndFunc
发表于 2011-3-14 13:11:39 | 显示全部楼层
本帖最后由 3mile 于 2011-3-14 13:15 编辑
借用水木子的思路 我用了0.006毫秒
shenrenba 发表于 2011-3-14 11:50

首先你的时间统计是有问题的.你的时间统计只是MSGBOX的反应时间.
如下面的代码再测试:
$sText = "key=白骨精他妈" & @CRLF & _
                "key=沙和尚" & @CRLF & _
                "key=白骨" & @CRLF & _
                "key=孙悟空" & @CRLF & _
                "key=沙和尚" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨精" & @CRLF & _
                "key=白骨" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨精" & @CRLF & _
                "key=白骨精他妈" & @CRLF & _
                "key=孙悟空"&@CRLF
$time=TimerInit()
$reulst= jj($sText)
MsgBox(0,Round(TimerDiff($time),5)&"毫秒", $reulst)
Func jj($Text)
        $sRer = StringRegExpReplace($Text, "(?m)(key=.+)(?=[^\1]+\1$)", "")
        $sRer = StringRegExpReplace($sRer, '^\v+|\r?\n(?=\r?\n)|\r?\n$', '')
        $sr = StringRegExp($sRer, "(key=.+)(?=[^\1]+\1\v)", 3)
        If Not @error Then
                jj($sRer)
        Else
                Return $sRer
        EndIf
EndFunc


其次你的效率也是有问题的.下面的代码测试:
$sText = "key=白骨精他妈" & @CRLF & _
                "key=沙和尚" & @CRLF & _
                "key=白骨" & @CRLF & _
                "key=孙悟空" & @CRLF & _
                "key=沙和尚" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨精" & @CRLF & _
                "key=白骨" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨精" & @CRLF & _
                "key=白骨精他妈" & @CRLF & _
                "key=孙悟空"&@CRLF

 $hfile=FileOpen("test.txt",1)
 FOR $I=1 TO 3000
         FileWrite($hfile,$sText)
         ToolTip($i)
 Next
 FileClose($hfile)
 $sText=fileread("test.txt")

$time=TimerInit()
$reulst= jj($sText)
MsgBox(0,Round(TimerDiff($time),5)&"毫秒", $reulst)
Func jj($Text)
        $sRer = StringRegExpReplace($Text, "(?m)(key=.+)(?=[^\1]+\1$)", "")
        $sRer = StringRegExpReplace($sRer, '^\v+|\r?\n(?=\r?\n)|\r?\n$', '')
        $sr = StringRegExp($sRer, "(key=.+)(?=[^\1]+\1\v)", 3)
        If Not @error Then
                jj($sRer)
        Else
                Return $sRer
        EndIf
EndFunc



用我的代码再来测试:
#include <File.au3>
$sText = "key=白骨精他妈" & @CRLF & _
                "key=沙和尚" & @CRLF & _
                "key=白骨" & @CRLF & _
                "key=孙悟空" & @CRLF & _
                "key=沙和尚" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨精" & @CRLF & _
                "key=白骨" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨精" & @CRLF & _
                "key=白骨精他妈" & @CRLF & _
                "key=孙悟空"&@CRLF

$hfile=FileOpen("test.txt",1)
FOR $I=1 TO 3000
        FileWrite($hfile,$sText)
        ToolTip($i)
Next
FileClose($hfile)
$sText=fileread("test.txt")

 
;~ $aFile = FileOpenDialog("快速删除重复行",@ScriptDir&"\","文本文件 (*.txt)", 1 + 4)
;~ If @error Then 
;~         MsgBox(0,0,"文件未选择",3)
;~         Exit
;~ EndIf
$aFile=@ScriptDir&"\test.txt"
$begin = TimerInit()
Local $str='',$file_array
_FileReadToArray($aFile,$file_array)
;_ArrayDisplay($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)
        $out_file=StringTrimRight($aFile,4)&'_已完成.txt'
        if FileExists($out_file) then FileDelete($out_file)
        FileWrite($out_file,$str)
        ShellExecute($out_file)
        WinWaitActive("[CLASS:Notepad]")
        WinSetTitle("[CLASS:Notepad]", "", '处理'&UBound($file_array)&'行'&'     用时'&int($dif)&'毫秒')
Exit
        
发表于 2011-3-14 13:22:43 | 显示全部楼层
看来删除文本文件中的重复行的方法还真多啊,感谢各位仙人在此各显神通。
面具人老师的代码是目前到16楼为 ...
kood481748 发表于 2011-3-14 11:16

这个应该很简单,自己也可以实现.
#include <File.au3>
$sText = "key=白骨精他妈" & @CRLF & _
                "key=沙和尚" & @CRLF & _
                "key=白骨" & @CRLF & _
                "key=孙悟空" & @CRLF & _
                "key=沙和尚" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨精" & @CRLF & _
                "key=白骨" & @CRLF & _
                "key=白骨夫人" & @CRLF & _
                "key=白骨精" & @CRLF & _
                "key=白骨精他妈" & @CRLF & _
                "key=孙悟空"&@CRLF

$hfile=FileOpen("test.txt",1)
FOR $I=1 TO 1
        FileWrite($hfile,$sText)
        ToolTip($i)
Next
FileClose($hfile)
$sText=fileread("test.txt")

 
$aFile = FileOpenDialog("快速删除重复行",@ScriptDir&"\","文本文件 (*.txt)", 1 + 4)
If @error Then 
        MsgBox(0,0,"文件未选择",3)
        Exit
EndIf
;$aFile=@ScriptDir&"\test.txt"
$begin = TimerInit()
Local $str='',$file_array,$delete_text
_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
                Else
                        $delete_text&=$file_array[$i]&@CRLF
        EndIf
Next
$dif = TimerDiff($begin)
        $out_file=StringTrimRight($aFile,4)&'_已完成.txt'
        if FileExists($out_file) then FileDelete($out_file)
        FileWrite($out_file,$str)
        ShellExecute($out_file)
        WinWaitActive("[CLASS:Notepad]")
        WinSetTitle("[CLASS:Notepad]", "", '处理'&UBound($file_array)&'行'&'     用时'&int($dif)&'毫秒')
                $out_file_delete=StringTrimRight($aFile,4)&'_已舍弃.txt'
                if FileExists($out_file_delete) then FileDelete($out_file_delete)
                FileWrite($out_file_delete,$delete_text)
Exit
        
FileDelete($aFile)
发表于 2011-3-14 14:10:35 | 显示全部楼层
本帖最后由 kevinch 于 2011-3-14 14:12 编辑

如果用字典的话,不能像楼主那样用的,应该用两个字典,一个放不重复的,一个放重复的,一次性写入文件,如果楼主那样每个写入的话想快很难的。
发表于 2011-3-15 22:14:56 | 显示全部楼层
太强悍,膜拜上面所有高手!!
发表于 2011-3-15 23:25:01 | 显示全部楼层
回复 15# 3mile


    太需要这个了,效率很棒!
发表于 2011-3-15 23:25:07 | 显示全部楼层
书签~~~~~~~~~
发表于 2011-3-18 22:54:54 | 显示全部楼层
这个要顶一下的
发表于 2011-3-19 07:36:56 | 显示全部楼层
O(∩_∩)O~ 又学到了不少东西
发表于 2011-3-19 17:09:57 | 显示全部楼层
新手学习了。。。。。。。。。
发表于 2011-3-19 22:50:06 | 显示全部楼层
$sRer = FileRead("D:\UserFile\Desktop\XXX.ini")
While 1
$b=$sRer
$sRer = StringRegExpReplace($sRer, '((key=[^\n]+\n)[^\2]+)\2', '\1')

If $b==$sRer  Then
        ExitLoop
        ;ExitLoop
        EndIf
WEnd

MsgBox(0, '', $sRer)
发表于 2011-3-19 22:51:58 | 显示全部楼层
我的代码需要在你的ini末尾加几个换行符
另外水木子大哥的正则还需要加强
发表于 2011-3-19 22:54:43 | 显示全部楼层
暂时没想到好的解决方案 最笨拙的方式就是每次给你删除一个新纪录就给你加一个换行符
发表于 2011-3-19 22:55:35 | 显示全部楼层
支持正则 楼主前来测试
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-16 18:35 , Processed in 0.072774 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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