用AU3怎样删除ini配置文件中重复的行?
本帖最后由 kood481748 于 2011-3-13 14:59 编辑本人做了一个词库的配置文件,其中保存了几千个成语,难免会有重复的成语,
现在我想用AU3来检索这个配置文件中是否包含有重复的成语(重复的行),
如果有重复的行则自动删除重复的那一行,请问怎么删除ini配置文件中重复的行?
$i="0"
$p="1"
DO
$mzbz = IniReadSection(@ScriptDir & "\XXX.ini", "config")
do
If $mzbz <> $mzbz Then
ToolTip("字符串1:"& $mzbz &@CR& "字符串2:"& $mzbz &@CR& "以上两个字符串不相同!如有重复将直接删除重复的行",@DesktopWidth-350, @DesktopHeight-130,"提示",1)
Sleep(1000)
$p = $p+1
Else
ToolTip("字符串1:"& $mzbz &@CR& "字符串2:"& $mzbz &@CR& "字符串1 和字符串2 相同! 程序将删除字符串2这一行",@DesktopWidth-350, @DesktopHeight-130,"提示",1)
EndIf
until $p = $mzbz
$i = $i+1
$p = $i+1
UNtil $p = $mzbz
配置文件XXX.ini内容如下:
key=白骨精他妈
key=沙和尚
key=白骨
key=孙悟空
key=白骨精
key=白骨夫人
key=孙悟空 #Include <File.au3>
$ini = "1.ini"
$line = _FileCountLines($ini)
For $i = 1 To $line
$lines = FileReadLine($ini,$i)
For $j = $i To $line
If $lines = FileReadLine($ini,$j) Then MsgBox(0,0,"发现相同行")
Next
Next 回复 1# kood481748
通过第三方文件中转一下,成么?学习中。。。。高手勿笑话。#include 'File.au3'
$file =FileOpen(@ScriptDir&"\xxx.ini",0)
_FileCreate(@ScriptDir&"\tmpxxx.ini")
If $file = -1 Then Exit(MsgBox(16,"test","读取本地的xxx.ini文件失败"))
For $i=1 To 10000
$filereading=FileReadLine($file,$i)
If @error =-1 Then
Exit(MsgBox(262144+64,"OK","全部处理完成!"))
EndIf
If Not StringInStr(FileRead (@ScriptDir&"\tmpxxx.ini"),$filereading) then
$filewrite =FileOpen(@ScriptDir&"\tmpxxx.ini",1)
FileWriteLine($filewrite ,$filereading)
FileClose($filewrite)
EndIf
Next
FileClose($file) 本帖最后由 水木子 于 2011-3-12 14:47 编辑
$sText = FileRead('XXX.ini')
$sRer = StringRegExpReplace($sText, '(key=.+)(?=[^\1]+\1)', '')
$sRer = StringRegExpReplace($sRer, '^\v+|\r?\n(?=\r?\n)|\r?\n$', '') ;去掉之前遗留下来的空行!
MsgBox(0, '', $sRer) 感谢各位老师的指导,学生会继续研究……
3楼老师的代码非常帅
4楼水版的代码我不知道怎么用在我的代码中 回复 5# kood481748
非得要发现重复的做提示后?再删除吗?
我这个只是直接帮你将整篇文本直接搞定,清除重复的内容。
水木子 发表于 2011-3-12 14:41 http://www.autoitx.com/images/common/back.gif
又一个像A版的正则牛人出现。。。。。我最近在看那个网上广为流传的30分钟教程,糊里糊头的。。。唉。。。痛苦中。。。。不知水版有何教材及方法么/?感激不尽。。。。 $file =FileOpen(@ScriptDir&"\xxx.ini",0)
If $file = -1 Then Exit(MsgBox(16,"test","读取本地的xxx.ini文件失败"))
$dic=objcreate("scripting.dictionary")
if isobj($dic) then
do
$str=FileReadLine($file)
If @error =-1 Then
Exit(MsgBox(262144+64,"OK","全部处理完成!"))
EndIf
If Not $dic.exists($str) then
$dic.add($str,"")
else
msgbox(0,0,"发现重复内容:" & $str)
EndIf
until @error=-1
endif
FileClose($file)一直想用字典的,今天终于用上一次{:face (396):} 谢谢分享!!学习了!! 回复 7# boyhong
先了解多一些,再连接精一些!
教程只能让带你“进门”,师傅带进门,修行靠个人。
多做练习,举一反三! 感谢各位老师的指点,经过我认真测试了一下,发现只有8楼“kevinch”的代码是最理想的,
3楼“boyhong”和4楼“水木子”的代码都有一点小问题,请看下图:
本帖最后由 kood481748 于 2011-3-13 15:07 编辑
以下是8楼“kevinch”的代码(稍作修改),用来处理文件中的重复行比较理想
$file =FileOpen(@ScriptDir&"\XXX.ini",0)
If $file = -1 Then Exit(MsgBox(16,"test","读取本地的xxx.ini文件失败"))
$dic=objcreate("scripting.dictionary")
if isobj($dic) then
do
$str=FileReadLine($file)
If @error =-1 Then
Exit(MsgBox(262144+64,"OK","全部处理完成!"))
EndIf
If Not $dic.exists($str) then
$dic.add($str,"")
$filewrite =FileOpen(@ScriptDir&"\处理后的文件.ini",1)
FileWriteLine($filewrite, $str)
FileClose($filewrite)
else
$filewrite =FileOpen(@ScriptDir&"\重复的行.ini",1)
FileWriteLine($filewrite, $str)
FileClose($filewrite)
EndIf
until @error=-1
endif
FileClose($file) 本帖最后由 netegg 于 2011-3-13 20:09 编辑
#cs
'file---1.ini'
key=白骨精他妈
key=沙和尚
key=白骨
key=孙悟空
key=白骨精
key=白骨夫人
key=孙悟空
#ce
#include<file.au3>
#include<array.au3>
Global $aA, $aB
_filereadtoarray('1.ini', $aA)
_Arraydelete($aA, 0)
$aB = _ArrayUnique($aA)
_Arraydelete($aB, 0)
_FileWriteFromArray('2.ini', $aB)
MsgBox(0,0,FileRead('2.ini')) 你提的意见没错,就算用正则,处理起来也不简单,毕竟只是相同,没有指定格式 回复 12# kood481748
如果上万行或数十万行的话,你这个效率也够呛.
蛋蛋兄提供的是一个相对成熟并且容易理解的方法.
既然提到效率,试试这个:
#include <File.au3>
$aFile = FileOpenDialog("快速删除重复行",@ScriptDir&"\","文本文件 (*.ini)", 1 + 4)
If @error Then
MsgBox(0,0,"文件未选择",3)
Exit
EndIf
$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)&'_已完成.ini'
if FileExists($out_file) then FileDelete($out_file)
FileWrite($out_file,$str)
ShellExecute($out_file)
WinWaitActive("")
WinSetTitle("", "", '处理'&UBound($file_array)&'行'&' 用时'&int($dif)&'毫秒')
Exit