ac5474012 发表于 2011-3-27 10:02:35

[求助]如何检测出一个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

netegg 发表于 2011-3-27 11:41:33

只给个思路,用正则把等号前面的都提出来,保留个数组,记录数组元素个数,_arrayunique之后再记录个数组元素个数,对减一下就是相同的数量,如果要知道确切的值用这个得到的数组再和第一个数组合并使用一次_arrayunique,得到元素索引就能出来了

yhxhappy 发表于 2011-3-27 11:55:46

可以试试用IniReadSection、IniReadSectionNames 将所有关键字录入一个数组,再排序,然后再从头到尾对比所有关键字。对比这个关键字和它的上一个是否相等,与它的下一个是否相等,如果都不相等就删除,最后剩下的应该就是重复的了。
没真正测试过,懒得建INI文件了

kevinch 发表于 2011-3-27 11:56:49

继续讨论用字典,key记录键名,item记录个数,就可以得到了

netegg 发表于 2011-3-27 12:07:16

回复 4# kevinch
字典和数组从本质上讲是一码事,连操作都差不多

ac5474012 发表于 2011-3-27 15:10:14

回复 3# yhxhappy

你的意思是每个关键字都来一边?

kevinch 发表于 2011-3-27 17:22:39

回复kevinch
字典和数组从本质上讲是一码事,连操作都差不多
netegg 发表于 2011-3-27 12:07 http://www.autoitx.com/images/common/back.gif
但是字典有索引,可以直接找到对应key的item项,数组只能用循环,这样在大量处理时的速度差异就相当大了。

yhxhappy 发表于 2011-3-27 17:49:24

回复 6# ac5474012


    对啊,速度应该很快吧

zitoy 发表于 2011-3-27 20:37:49

用字典 ??

ac5474012 发表于 2011-3-28 12:34:33

字典不熟悉,能给个例子吗?

kevinch 发表于 2011-3-28 13:47:59

参考以下两帖:
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内容就是重复的次数。

yhxhappy 发表于 2011-3-28 18:24:54

写了一个,随机生成一个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)

afan 发表于 2011-3-28 22:29:35

“相同的关键字”是指同一字段的才算还是不同字段的也算?
需要返回什么结果?

提问要具体,并给出示例(范本)。且应尽量考虑可能存在的多种情况,免得返工。

3mile 发表于 2011-3-28 22:36:06

参考以下两帖:


只不过本例中再向字典赋值的话要改一下了,通过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 11:04:12

本帖最后由 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
查看完整版本: [求助]如何检测出一个ini中有那些相同的关键字?