[求助]如何检测出一个ini中有那些相同的关键字?
本帖最后由 ac5474012 于 2011-3-29 12:58 编辑[求助]如何检测出一个ini中同一个字段中有那些相同的关键字?
我希望返回返回这些关键字是什么,并且根据这些相同关键字的数值删除关键字。;比如我的关键字的数值是可以计算机的时间,我希望只保留距离当前时间最近的关键字
INI文件样本
33213208=2011/03/26 13:03:24
14450634=2011/03/27 16:59:46
8234480=2011/02/25 00:00:00
8234480=2011/02/24 00:00:00 只给个思路,用正则把等号前面的都提出来,保留个数组,记录数组元素个数,_arrayunique之后再记录个数组元素个数,对减一下就是相同的数量,如果要知道确切的值用这个得到的数组再和第一个数组合并使用一次_arrayunique,得到元素索引就能出来了 可以试试用IniReadSection、IniReadSectionNames 将所有关键字录入一个数组,再排序,然后再从头到尾对比所有关键字。对比这个关键字和它的上一个是否相等,与它的下一个是否相等,如果都不相等就删除,最后剩下的应该就是重复的了。
没真正测试过,懒得建INI文件了 继续讨论用字典,key记录键名,item记录个数,就可以得到了 回复 4# kevinch
字典和数组从本质上讲是一码事,连操作都差不多 回复 3# yhxhappy
你的意思是每个关键字都来一边? 回复kevinch
字典和数组从本质上讲是一码事,连操作都差不多
netegg 发表于 2011-3-27 12:07 http://www.autoitx.com/images/common/back.gif
但是字典有索引,可以直接找到对应key的item项,数组只能用循环,这样在大量处理时的速度差异就相当大了。 回复 6# ac5474012
对啊,速度应该很快吧 用字典 ?? 字典不熟悉,能给个例子吗? 参考以下两帖:
http://www.autoitx.com/forum.php?mod=viewthread&tid=23071&rpid=279652&ordertype=0&page=1#pid279652
http://www.autoitx.com/forum.php?mod=viewthread&tid=22718&extra=&page=1
只不过本例中再向字典赋值的话要改一下了,通过dic.exists(key)来判断,第一次dic(key)=1,第二次开始dic(key)=dic(key)+1,其中key的值就是键名,最终结果中item项大于1的就是重复的项,而item内容就是重复的次数。 写了一个,随机生成一个500条的数组来模拟读取INI文件后生成的数组,然后排序,最后删除不重复的条目。#include <array.au3>
$Num = 500
Global $array[$Num]
For $i = 1 To $Num-1
$array[$i] = Random(1111, 9999, 1)
Next
;Global $Array
;$Section = IniReadSectionNames(@DesktopDir & "\TEST.ini")
;For $i = 1 To $Section
; $Key = IniReadSection(@DesktopDir & "\TEST.ini", $Section[$i])
; For $c = 1 To $Key
; ReDim $Array
; $Array = $Key[$c]
; $Array = $Key[$c]
; Next
;Next
_ArraySort($Array, 0, 1);排序数组
Local $i = 1
While 1
Switch $i
Case 1
If $Array[$i] <> $Array[$i+1] Then
_ArrayDelete($Array, $i)
$i = 1
Else
$i += 1
EndIf
Case 2 To UBound($Array)-2
If $Array[$i] <> $Array[$i-1] And $Array[$i] <> $Array[$i+1] Then
_ArrayDelete($Array, $i)
$i = $i
Else
$i += 1
EndIf
Case UBound($Array)-1
If $Array[$i] <> $Array[$i-1] Then _ArrayDelete($Array, $i)
ExitLoop
EndSwitch
WEnd
$Array = UBound($array)-1
_ArrayDisplay($array) “相同的关键字”是指同一字段的才算还是不同字段的也算?
需要返回什么结果?
提问要具体,并给出示例(范本)。且应尽量考虑可能存在的多种情况,免得返工。 参考以下两帖:
只不过本例中再向字典赋值的话要改一下了,通过dic.exists(key)来判断,第一次dic(key ...
kevinch 发表于 2011-3-28 13:47 http://www.autoitx.com/images/common/back.gif
学习下使用字典.
#include <array.au3>
#include <file.au3>
$aFile = FileOpenDialog("快速删除重复行",@ScriptDir&"\","文本文件 (*.txt;*.ini)", 1 + 4)
If @error Then
MsgBox(0,0,"文件未选择",3)
Exit
EndIf
$time = TimerInit()
local $file
_FileReadToArray($aFile,$file)
$o_Dic=objcreate("scripting.dictionary");创建字典项目
$out_Dic=objcreate("scripting.dictionary")
local $k=1,$out
for $i=1 to $file
if Not $o_Dic.exists($file[$i]) then ;判断KEY是否存在
$o_Dic($file[$i]);增加新Key
$o_Dic.item($file[$i])=$k;定义Item
Else
$k=$o_Dic.item($file[$i])+1;得到重复次数
$o_Dic.item($file[$i])=$k;将重复次数修改为ITEM
$out&=$file[$i]&@CRLF;已经丢弃
EndIf
Next
$a_Arr=$o_Dic.keys
FileWrite(StringTrimRight($aFile,4)&"已整理."&StringRight($aFile,3),_ArrayToString($a_Arr,@CRLF)&@CRLF&TimerDiff($time));写入处理过的文件
FileWrite(StringTrimRight($aFile,4)&"已丢弃.txt",$out)
$b_Arr=$o_Dic.items
if UBound($a_Arr)=UBound($b_Arr) Then
local $out_array
for $i=0 to UBound($a_Arr)-1
$out_array[$i]=$a_Arr[$i]
$out_array[$i]=$b_Arr[$i]
Next
EndIf
_arraydisplay($out_array);返回重复次数的二维数组
本帖最后由 ac5474012 于 2011-3-29 12:59 编辑
回复 13# afan
“相同的关键字”是指同一字段的才算还是不同字段的也算?
需要返回什么结果?
提问要具体,并给出示例 ...
afan 发表于 2011-3-28 22:29 http://www.autoitx.com/images/common/back.gif
你说的是
1.“相同的关键字”是指同一个字段的。
2.需要返回什么结果?我的意思是返回这些关键字是什么,并且根据这些相同关键字的数值删除关键字。;比如我的关键字的数值是可以计算机的时间,我希望只保留距离当前时间最近的关键字
INI文件样本
33213208=2011/03/26 13:03:24
14450634=2011/03/27 16:59:46
8234480=2011/02/25 00:00:00
8234480=2011/02/24 00:00:00
页:
[1]
2