找回密码
 加入
搜索
查看: 7805|回复: 18

[AU3基础] [求助]如何检测出一个ini中有那些相同的关键字?

 火.. [复制链接]
发表于 2011-3-27 10:02:35 | 显示全部楼层 |阅读模式
本帖最后由 ac5474012 于 2011-3-29 12:58 编辑

[求助]如何检测出一个ini中同一个字段中有那些相同的关键字?

我希望返回返回这些关键字是什么,并且根据这些相同关键字的数值删除关键字。;比如我的关键字的数值是可以计算机的时间,我希望只保留距离当前时间最近的关键字

INI文件样本
[sql]
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
发表于 2011-3-27 11:41:33 | 显示全部楼层
只给个思路,用正则把等号前面的都提出来,保留个数组,记录数组元素个数,_arrayunique之后再记录个数组元素个数,对减一下就是相同的数量,如果要知道确切的值用这个得到的数组再和第一个数组合并使用一次_arrayunique,得到元素索引就能出来了

评分

参与人数 1金钱 +15 收起 理由
ac5474012 + 15 伸手党来啦~

查看全部评分

发表于 2011-3-27 11:55:46 | 显示全部楼层
可以试试用IniReadSection、IniReadSectionNames 将所有关键字录入一个数组,再排序,然后再从头到尾对比所有关键字。对比这个关键字和它的上一个是否相等,与它的下一个是否相等,如果都不相等就删除,最后剩下的应该就是重复的了。
没真正测试过,懒得建INI文件了
发表于 2011-3-27 11:56:49 | 显示全部楼层
继续讨论用字典,key记录键名,item记录个数,就可以得到了
发表于 2011-3-27 12:07:16 | 显示全部楼层
回复 4# kevinch
字典和数组从本质上讲是一码事,连操作都差不多
 楼主| 发表于 2011-3-27 15:10:14 | 显示全部楼层
回复 3# yhxhappy

你的意思是每个关键字都来一边?
发表于 2011-3-27 17:22:39 | 显示全部楼层
回复  kevinch
字典和数组从本质上讲是一码事,连操作都差不多
netegg 发表于 2011-3-27 12:07

但是字典有索引,可以直接找到对应key的item项,数组只能用循环,这样在大量处理时的速度差异就相当大了。
发表于 2011-3-27 17:49:24 | 显示全部楼层
回复 6# ac5474012


    对啊,速度应该很快吧
发表于 2011-3-27 20:37:49 | 显示全部楼层
用字典 ??
 楼主| 发表于 2011-3-28 12:34:33 | 显示全部楼层
字典不熟悉,能给个例子吗?
发表于 2011-3-28 13:47:59 | 显示全部楼层
参考以下两帖:
http://www.autoitx.com/forum.php ... mp;page=1#pid279652
http://www.autoitx.com/forum.php ... p;extra=&page=1
只不过本例中再向字典赋值的话要改一下了,通过dic.exists(key)来判断,第一次dic(key)=1,第二次开始dic(key)=dic(key)+1,其中key的值就是键名,最终结果中item项大于1的就是重复的项,而item内容就是重复的次数。

评分

参与人数 1金钱 +20 收起 理由
3mile + 20 学习了

查看全部评分

发表于 2011-3-28 18:24:54 | 显示全部楼层
写了一个,随机生成一个500条的数组来模拟读取INI文件后生成的数组,然后排序,最后删除不重复的条目。
#include <array.au3>

$Num = 500
Global $array[$Num][2]
For $i = 1 To $Num-1
        $array[$i][0] = Random(1111, 9999, 1)
Next

;Global $Array[1][2]
;$Section = IniReadSectionNames(@DesktopDir & "\TEST.ini")
;For $i = 1 To $Section[0]
;        $Key = IniReadSection(@DesktopDir & "\TEST.ini", $Section[$i])
;        For $c = 1 To $Key[0][0]
;                ReDim $Array[UBound($Array)+1][2]
;                $Array[UBound($Array)-1][0] = $Key[$c][0]
;                $Array[UBound($Array)-1][1] = $Key[$c][1]
;        Next
;Next

_ArraySort($Array, 0, 1)  ;排序数组

Local $i = 1
While 1
        Switch $i
        Case 1
                If $Array[$i][0] <> $Array[$i+1][0] Then
                        _ArrayDelete($Array, $i)
                        $i = 1
                Else
                        $i += 1
                EndIf
        Case 2 To UBound($Array)-2
                If $Array[$i][0] <> $Array[$i-1][0] And $Array[$i][0] <> $Array[$i+1][0] Then
                        _ArrayDelete($Array, $i)
                        $i = $i
                Else
                        $i += 1
                EndIf                
        Case UBound($Array)-1
                If $Array[$i][0] <> $Array[$i-1][0] Then _ArrayDelete($Array, $i)
                ExitLoop
        EndSwitch
WEnd
$Array[0][0] = UBound($array)-1
_ArrayDisplay($array)
发表于 2011-3-28 22:29:35 | 显示全部楼层
“相同的关键字”是指同一字段的才算还是不同字段的也算?
需要返回什么结果?

提问要具体,并给出示例(范本)。且应尽量考虑可能存在的多种情况,免得返工。
发表于 2011-3-28 22:36:06 | 显示全部楼层
参考以下两帖:


只不过本例中再向字典赋值的话要改一下了,通过dic.exists(key)来判断,第一次dic(key ...
kevinch 发表于 2011-3-28 13:47


学习下使用字典.
#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[0]
        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[UBound($a_Arr)][2]
        for $i=0 to UBound($a_Arr)-1
                $out_array[$i][0]=$a_Arr[$i]
                $out_array[$i][1]=$b_Arr[$i]
        Next
EndIf
_arraydisplay($out_array);返回重复次数的二维数组
 楼主| 发表于 2011-3-29 11:04:12 | 显示全部楼层
本帖最后由 ac5474012 于 2011-3-29 12:59 编辑

回复 13# afan

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

提问要具体,并给出示例 ...
afan 发表于 2011-3-28 22:29


你说的是
1.“相同的关键字”是指同一个字段的。
2.需要返回什么结果?我的意思是返回这些关键字是什么,并且根据这些相同关键字的数值删除关键字。;比如我的关键字的数值是可以计算机的时间,我希望只保留距离当前时间最近的关键字

INI文件样本
[sql]
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
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 09:26 , Processed in 0.090003 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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