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

[系统综合] 如何判定ini中不同字段名中关键值是否达到指定数量

 火.. [复制链接]
发表于 2014-11-4 15:19:19 | 显示全部楼层
本帖最后由 dunphy 于 2014-11-5 02:37 编辑

回复 15# netegg


  如何来筛刷呢? 假设BB=1的情况有4999个,那不是要循环12次才能筛刷完?如5楼写入数组后,像我这样循环完了,怎么重新义新数组并加提示? 我不知道如何整理这些数组了

#include <Array.au3>

Global $gc_IniFile = @ScriptDir & "\aa.ini"
Global $Pzname1 = "aa", $Pzname2 = "bb"
Local $sSection = IniReadSectionNames($gc_IniFile) ;返回字段名

Local $a = 2
Local $a_bb[100][3] ;创建一个数组来展示
$a_bb[0][0] = $sSection[0]
$a_bb[0][1] = 'bb'
$a_bb[0][2] = 1
;;Local $c = Mod($sSection[0], $a)

For $I = 1 To $a_bb[0][0]
        $a_bb[$I][0] = Floor($a_bb[($I - 1)][0] / $a) ;除以2取整舍去小数部份
        $a_bb[$I][1] = 'bb'
        $a_bb[$I][2] = $I + 1
        If $a_bb[$I][0] = 1 Then
                Local $vol_i = $I ;记录元素的个数
                ExitLoop
        EndIf
Next
ReDim $a_bb[$vol_i + 1][3]

_ArrayDisplay($a_bb, "$a_bb")

;读取文件到数组
Local $a_SecName[UBound($sSection)][5], $I ;5001
For $I = 1 To $a_bb[0][0] ;1-5000
        Local $a_KeyWord = IniReadSection($gc_IniFile, $sSection[$I]) ;返回关键字
        $a_SecName[0][0] = "字段名"
        $a_SecName[0][1] = "第一关键字"
        $a_SecName[0][2] = "第一关键字的值"
        $a_SecName[0][3] = "第二关键字"
        $a_SecName[0][4] = "第二关键字的值"

        $a_SecName[$I][0] = $sSection[$I]
        $a_SecName[$I][1] = $a_KeyWord[1][0]
        $a_SecName[$I][2] = $a_KeyWord[1][1]
        $a_SecName[$I][3] = $a_KeyWord[2][0]
        $a_SecName[$I][4] = $a_KeyWord[2][1]

Next
If Mod($sSection[0], $a) = 1 Then
        MsgBox(0, "提示", "存在不同的项" & "在第" & $sSection[0] & "行")
EndIf
_ArrayDisplay($a_SecName, "配置文件数组")

Local $m, $k
For $m = 1 To UBound($a_bb) - 1 Step 1
        If Mod($a_bb[$m][0], $a) = 1 Then
                MsgBox(0, "提示", "存在不同的项" & "在第" & $a_bb[$m][0] & "行")
        EndIf
        ;5001
        Local $I, $j = 1, $p = 1 ;定义数组$ARAY2[2500+1][5]来存放判定后的值
        Local $array2[$a_bb[$m][0] + 1][5]
        For $I = 2 To $a_bb[$m - 1][0] Step 2 ;2-5000
                If StringCompare($a_SecName[$I][4], $a_SecName[$j][4]) = 0 Then ; 两两比较,如果连续二个的BB值为1,则追加一字段,并赋值给BB=2
                        $array2[$p][0] = "a" & ($a_bb[0][0] + 1 + $k)
                        $array2[$p][1] = $Pzname1
                        $array2[$p][2] = 123
                        $array2[$p][3] = $Pzname2
                        $array2[$p][4] = $a_bb[$m][2]
                        
                        
                        ;IniWrite ( "文件名", "字段", "关键字", "值" )
                        ;IniWrite($gc_IniFile, "a"&$k, $Pzname1, 123)   ;向字段名a101 中写入aa=123
                        ;IniWrite($gc_IniFile, "a"&$k, $Pzname2, 2)     ;向字段名a101 中写入BB=2
                EndIf
                

                $p += 1
                $j += 2
                $k += 1
        Next

        _ArrayDisplay($array2, "$array2")
Next
发表于 2014-11-4 18:04:45 | 显示全部楼层
学习学习、、、、、、、、、、、、、
 楼主| 发表于 2014-11-5 12:37:46 | 显示全部楼层
回复 16# dunphy

[55]
aa=123456
bb=1
[47]
aa=45125
bb=1
[51]
aa=74582
bb=2
    就比方说,我的配置如上,去判断,设值,如bb=1 文件里面存在2个的话,那就判断bb=2有没有2个,有的话继续类推,反之,如果bb=2 只有1个,那么我就在添加一个(下方),一次类推!
[a1]
aa=123
bb=2
发表于 2014-11-5 18:57:11 | 显示全部楼层
前来学习。。。。。。。。。。。。
发表于 2014-11-5 22:38:37 | 显示全部楼层
本帖最后由 dunphy 于 2014-11-5 23:22 编辑

回复 18# abcd1234
5楼就说你,举个批例子都说不清楚,也不知道是不是我理解的太简单了,建议贴上你原来的配置文件.....

我用数组是随机举例,如你的配置所说,应先判断再提示,直到判断BB=3.BB=4..... BB=N 完,不能在判断中在原数组或者原配置文件写入一个段名和值,只可以重新写入另一个配置文件或者在另一个数组设置一个段名和值,也不知道你最后要展示给大家的是什么。。因为你例出的段名和值太短,都不知道你要表达的是什么意思。。。。

提问:   1,如果BB=1只有一个或者如我举例BB=1的情况为奇数,不是两两相比较么,如果判断至最后只有一个怎么办,还要向新配置文件中写入下面所示的么?
[XX]
aa=123
bb=1

看了你原配置文件,也就是说,里面也有BB=2.BB=3......BB=N。。   举个示例见下: 我暂且举例N到5 (LZ你就不能把你的配置文件贴出来么?)也不知道你是不是这种情况。。只能猜罗
[55]
aa=123456
bb=1
[47]
aa=45125
bb=1
[23]
aa=452125
bb=1
[51]
aa=74582
bb=2  
[513]
aa=724582
bb=2  
[22]
aa=7282
bb=3 
[26]
aa=7272
bb=3 
[29]
aa=7272
bb=4
[291]
aa=72721
bb=5
如上的配置文件,

提问:   2: 先判断BB=1的情况是否为2个,(或者说为偶数个,不知道你是不是这个意思),(如果为1或者说为奇数个该怎么办??)  ,
提问:  3: 如果是2个(或者偶数个,也不知你是不是这个意思)  那么判断BB=2的情况是不是也是2个,
提问:  4 : 如果判断出BB=2的情况为1个,或者说奇数个。在另外的段里写入
[A1]
aa=123
bb=2
提问:   5: 这里的段名A1是不是指判断为 BB=1 情况为1的时候(或者奇数个),才向新配置文件中写入段名A1,和 值AA=123
提问:   6: 当判断 原配置文件bb的值=2的时候,(包不包括上面这个重新向新配置文件写入的段名和值)   ..如果不包括,原配置文件BB=2的情况为1个或者偶数个后,应该向新配置文件写入新的段名?)写法:
[A2]
AA=123
bb=3
7: 是否就这样筛刷到完。。。



最好楼主请将你的配置文件代码贴出来
 楼主| 发表于 2014-11-7 22:00:23 | 显示全部楼层
[55]
aa=123456
bb=1
[47]
aa=45125
bb=1
[23]
aa=452125
bb=1
[51]
aa=74582
bb=2  
[513]
aa=724582
bb=2  
[22]
aa=7282
bb=3
[26]
aa=7272
bb=3
[29]
aa=7272
bb=4
[291]
aa=72721
bb=5
比如,[]内不固定值,aa=也是不固定值的!bb=是1~n,
[A2]
AA=123
bb=1
如果我固定为8个,我点击下按钮,就开始去判断bb=1是不是有8个[如上]的配置,当然,bb=1怎么都不会超过8个,如果判断bb=1购8个,那么,就开始判断bb=2是不是有8个,如果只有7个,那么我就添加一个,到添加完毕后,按钮过程结束{如下}
[A2] ;不固定值
AA=123;不固定值
bb=2

我再次点击按钮,就像上面一次判断bb=1等于8个不,等于就继续bb=2判断,依次类推,没达到8个,就在配置文件里添加一个[如下]
[A2] ;不固定值
AA=123;不固定值
bb=3

添加一次,就完成了一个按钮的操作,后面点击按钮,则如上判断,然后添加
发表于 2014-11-10 08:09:55 | 显示全部楼层
回复 16# dunphy
不要定义固定数组,dim一个只有一个元素的数组,然后redim
发表于 2014-11-10 20:44:14 | 显示全部楼层
回复 23# netegg

嗯。我今天有点事,下来我研究研究
发表于 2014-11-10 20:47:23 | 显示全部楼层
本帖最后由 dunphy 于 2014-11-10 20:55 编辑

回复 21# abcd1234
我现在都还似懂非懂你提的问题,不过大概快要明白了

你3楼说了,不够你所要筛刷的上限数就要弹出信息框提示,
提问1:如你所设的匹配数为8,当BB=1小于8个的时候提不提示??
这里大于8个的时候就在未尾写入一个
[22]  ;段名不固定
AA=232 ;值232不固定  ,AA要固定撒吗?????
BB=2  

提问2:当BB=2 至N的的时候,每按一次键去判断,当小于你所设的匹配数8,也不提示了吗?
 楼主| 发表于 2014-11-10 22:07:49 | 显示全部楼层
不用提示,判断bb=1,小于8个的话就写入
[22]  ;段名不固定
AA=232 ;值232不固定  ,AA要固定撒吗?????
BB=1  ;这个与上面判断的数值一样!

如果bb=1等于8个,就判断bb=2等于8个不,如果小于8个就添加
[22]  ;段名不固定
AA=232 ;值232不固定  ,AA要固定撒吗?????
BB=2  ;这个与上面判断的数值一样!

依次类推!~~
发表于 2014-11-11 20:52:58 | 显示全部楼层
描述不清的问题竟然能讨论得这么热闹,真出乎我的意料啊.
按楼主的一再描述,问题关键在确定总个数少于8个的 'bb=N', 这个N是多少吧?

感觉用个递归就解决了.
楼主用你自己的INI文件测试吧.
Global Const $iCount = 8
Local $text = ClipGet();FileRead('your.ini')
Local $key = 'bb'
Local $val = 1
Local $num = _get_my_val($text, $key, $val)
MsgBox(64, 'result', $key & '=' & $val & @CRLF & '个数:' & $num)

Func _get_my_val($sText, $sKey, ByRef $iVal)
        Local $iRe = 0
        Local $sMatch = '(?m)^' & $sKey & '=' & $iVal & '[\r\n]'
        Local $aStr = StringRegExp($sText, $sMatch, 3)
        If Not @error Then
                If UBound($aStr) >= $iCount Then
                        $iVal += 1
                        Return _get_my_val($sText, $sKey, $iVal)
                Else
                        $iRe = UBound($aStr)
                EndIf
        EndIf
        Return $iRe
EndFunc
 楼主| 发表于 2014-11-12 08:42:33 | 显示全部楼层
回复 27# user3000


    讨论的最高境界就是,明知不可为而为之,延伸出另一种问题出来! 哈哈! 感谢各位同仁!
发表于 2014-11-17 21:02:37 | 显示全部楼层
本帖最后由 dunphy 于 2014-11-27 23:16 编辑

回复 27# abcd1234

今天有空改了改,随机了100个,段名不固定了,AA的值不固定了,然后平均分配了一下,BB =1;2;3;4;5的情况各20,  你看你的例子才出来。。我先贴代码

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiIPAddress.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <Array.au3>

HotKeySet("{ESC}", "HotKeyPressed")
Global Const $gc_formName = "配置文件"
Global $ini = @ScriptDir & "\*.ini"
Global $a_PznameA = "aa", $a_PznameB = "bb"

Local $a_bbval[6], $P = 1
For $i = 1 To 5
        $a_bbval[$i] = $P
        $P += 1
Next


#Region
Global $gu_PzForm = GUICreate("gc_formName", 403, 289, 340, 128)
Global $gu_PzGroup1 = GUICtrlCreateGroup("[1] 设置随机数", 16, 8, 377, 49)
Global $gu_PzInput1 = GUICtrlCreateInput("", 39, 23, 41, 21, $ES_READONLY)
Global $gu_PzLabel1 = GUICtrlCreateLabel("个随机数", 84, 30, 52, 17)
Global $gu_PzButton1 = GUICtrlCreateButton("设置", 304, 24, 51, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $gu_PzGroup2 = GUICtrlCreateGroup("[2]设置配置文件", 13, 62, 382, 68)
Global $gu_PzInput2 = GUICtrlCreateInput("", 33, 88, 244, 21)
GUICtrlSetData($gu_PzInput2, $ini)
Global $gu_PzButton2 = GUICtrlCreateButton("随机写数", 296, 86, 70, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $gu_PzGroup3 = GUICtrlCreateGroup("[3] 设置匹配值", 16, 136, 377, 57)
Global $gu_PzInput3 = GUICtrlCreateInput("", 36, 157, 49, 21)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $gu_PzButton3 = GUICtrlCreateButton("关于(A)", 13, 250, 59, 25)
Global $gu_PzButton4 = GUICtrlCreateButton("判断", 264, 250, 59, 25)
Global $gu_PzButton5 = GUICtrlCreateButton("退出(X)", 328, 250, 59, 25)
GUISetState(@SW_SHOW)
#EndRegion

_Main() ;主函数开始
Exit

Func _Main()

        Local $nMsg
        While 1
                $nMsg = GUIGetMsg()
                Switch $nMsg
                        Case $GUI_EVENT_CLOSE
                                Exit
                        Case $gu_PzButton1
                                ;Local $Number = Random(1, 29, 1)
                                GUICtrlSetData($gu_PzInput1, Random(150, 200, 1))
                                Local $pz_rdnum = GUICtrlRead($gu_PzInput1)
                                MsgBox(0, "提示", "准备输入" & $pz_rdnum & "个随机数", 1)
                                
                        Case $gu_PzButton2
                                If GUICtrlRead($gu_PzInput1) = "" Then
                                        MsgBox(16, "提示", "请先设置随机数")
                                Else
                                        Global $path = FileSaveDialog("配置文件存储位置", _
                                                        @ScriptDir, "配置文件.ini (*.ini)|所有文件(*.*)", 1 + 8, _
                                                        "*.ini", $gu_PzForm)
                                        If @error Then
                                                MsgBox(16, "提示", "你未选择INI文件.")

                                        Else
                                                If FileExists($path) = 1 Then FileDelete($path)

                                                Global $a_Numbers = _RandomNumber()
                                                ;        _SortArray($a_Numbers)                   ;从小到大排序

                                                Local $i, $j = UBound($a_Numbers) - 1, $P = 1
                                                For $i = 1 To 8 Step 1
                                                        IniWrite($path, $a_Numbers[$i], $a_PznameA, $a_Numbers[$j])
                                                        IniWrite($path, $a_Numbers[$i], $a_PznameB, $a_bbval[1])
                                                        $j -= 1

                                                Next
                                                For $i = 9 To 16 Step 1
                                                        IniWrite($path, $a_Numbers[$i], $a_PznameA, $a_Numbers[$j])
                                                        IniWrite($path, $a_Numbers[$i], $a_PznameB, $a_bbval[2])
                                                        $j -= 1
                                                Next

                                                For $i = 17 To 24 Step 1
                                                        IniWrite($path, $a_Numbers[$i], $a_PznameA, $a_Numbers[$j])
                                                        IniWrite($path, $a_Numbers[$i], $a_PznameB, $a_bbval[3])
                                                        $j -= 1
                                                Next

                                                For $i = 25 To 32 Step 1
                                                        IniWrite($path, $a_Numbers[$i], $a_PznameA, $a_Numbers[$j])
                                                        IniWrite($path, $a_Numbers[$i], $a_PznameB, $a_bbval[4])
                                                        $j -= 1
                                                Next
                                                For $i = 33 To 40 Step 1
                                                        IniWrite($path, $a_Numbers[$i], $a_PznameA, $a_Numbers[$j])
                                                        IniWrite($path, $a_Numbers[$i], $a_PznameB, $a_bbval[5])
                                                        $j -= 1
                                                Next
                                                GUICtrlSetData($gu_PzInput2, $path)
                                                MsgBox(0, "提示:", "成功写入配置文件" & @CRLF & "请在当前程序目录查看")
                                        EndIf
                                        
                                EndIf
                        Case $gu_PzButton4
                    _readSecName()
                                _Exists()
                        Case $gu_PzButton3
                                MsgBox(0 + 64, $gc_formName, "提示:" & @CRLF & "1.先设置随机数" _
                                                 & @CR & "2.保存文件并随机写数" _
                                                 & @CR & "3.设置查寻值并判断。")

                        Case $gu_PzButton5
                                Exit
                EndSwitch
        WEnd

EndFunc   ;==>_Main

Func _RandomNumber()
        Local $a_Numbers[1], $P = 1
        While $P <=  GUICtrlRead($gu_PzInput1) ;随机 所设的上限值 个四位正整数
                Local $Number = StringFormat("%03s", Random(1000, 8000, 1))
                Local $i, $f = 1
                For $i = 1 To UBound($a_Numbers, 1) - 1
                        If $a_Numbers[$i] = $Number Then
                                $f = 0
                                ExitLoop
                        EndIf
                Next
                If $f = 1 Then
                        ReDim $a_Numbers[$P + 1]
                        $a_Numbers[$P] = $Number
                        $P += 1
                EndIf
        WEnd
        ;;        _ArrayDisplay( $a_Numbers," $a_Numbers")
        Return $a_Numbers
EndFunc   ;==>_RandomNumber

Func _readSecName()
        If GUICtrlRead($gu_PzInput1) = "" Then
                MsgBox(16, "提示", "请先设置随机数再判断")
        Else
                Local $sSection = IniReadSectionNames(GUICtrlRead($gu_PzInput2))
                If @error Then
                        MsgBox(16, "提示", "先配置文件地址再判断")
                Else
                        Local $a_SecName[$sSection[0] + 1][5]
                        For $i = 1 To UBound($a_SecName) - 1
                                Local $pz_array = IniReadSection($path, $sSection[$i])
                                $a_SecName[0][0] = "字段名"
                                $a_SecName[0][1] = "第一关键字"
                                $a_SecName[0][2] = "第一关键字的值"
                                $a_SecName[0][3] = "第二关键字"
                                $a_SecName[0][4] = "第二关键字的值"

                                $a_SecName[$i][0] = $sSection[$i]
                                $a_SecName[$i][1] = $pz_array[1][0]
                                $a_SecName[$i][2] = $pz_array[1][1]
                                $a_SecName[$i][3] = $pz_array[2][0]
                                $a_SecName[$i][4] = $pz_array[2][1]

                        Next

                EndIf
        EndIf
        ;;_ArrayDisplay($a_SecName, "$a_SecName")
        Return $a_SecName
EndFunc   ;==>_readSecName


Func _Exists()
        Local $SearchVal = GUICtrlRead($gu_PzInput3)
        If $SearchVal = "" Then
                MsgBox(16, "提示", "请输入查寻值", 1)
        ElseIf StringIsInt($SearchVal) = "" Then
                MsgBox(16, "提示", "你输入查寻值为" & $SearchVal & @CRLF & "你输入的值不为数字请重新输入")
        Else
        Local $i
                For $i = 1 To UBound($a_bbval) - 1
                        Local $a_SecName = _readSecName()
                        Local $iIndex = _ArrayFindAll($a_SecName, $a_bbval[$i], Default, Default, Default, Default, 4)
           TrayTip("现在有" & UBound($iIndex) & "个BB=" & $a_bbval[$i] & @CRLF & ",你的匹配值为" & $SearchVal, "提示", 1)
                        If UBound($iIndex) < $SearchVal Then ; 小于所设的匹配值则写入一个BB=1
                                Local $p
                                Local $n = $SearchVal - UBound($iIndex)
        
                                For $p=1 To $n
                                Local $j = Random(100, GUICtrlRead($gu_PzInput1), 1)
                                Local $k = Random(100, GUICtrlRead($gu_PzInput1), 1)
                                
                                IniWrite(GUICtrlRead($gu_PzInput2), $a_Numbers[$j], $a_PznameA, $a_Numbers[$k])
                                IniWrite(GUICtrlRead($gu_PzInput2), $a_Numbers[$j], $a_PznameB, $a_bbval[$i])
                                Next
                                EndIf
                                
         _ArrayDisplay($a_SecName, "$a_SecName")
                Next
        EndIf
EndFunc   ;==>_Exists

Func HotKeyPressed()
        Switch @HotKeyPressed ; 最后按下的热键.
                Case "{ESC}" ; {ESC} 是"退出"热键.
                        Exit
        EndSwitch
EndFunc   ;==>HotKeyPressed

发表于 2014-11-17 21:29:17 | 显示全部楼层
本帖最后由 dunphy 于 2014-11-27 19:43 编辑

回复 25# abcd1234

按25L 你所说,(也就是判断28楼例子里的aa.ini不同字段关键值达到所设的数量)
依照28L的例子。如果你所设的值为11  就开始判断了
  
 1。 循规判断BB=1--BB=5的数量"8"小于11的时候
 IF "8"< 11   then  ;(我平均分配了8个) 如果小于11个,则写入
  IniWrite($path,"随意段名", $a_PznameA, "随意值")
  IniWrite($path, "同上的段名", $a_PznameB, 1) 
endif
循环BB=2,BB=3。BB=4,BB=5
最后,应该都是11个。 是不是这个意思? 应该解决了。
发表于 2014-11-20 15:40:04 | 显示全部楼层
前来学习、、、、、、、、、、、、、、、、、、
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-2 14:58 , Processed in 0.077024 second(s), 13 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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