wangms 发表于 2014-8-4 20:34:51

【已解决谢afan老师】仿造的函数问题出在哪儿呢?

本帖最后由 wangms 于 2014-8-4 22:52 编辑

为了在非标ini文件里添加和删除一行,曾发过求助帖子http://www.autoitx.com/thread-44924-1-1.html,无果。到处寻觅,还是在afan老师<_ini.au3>里找到_IniWrite()添加一行、_IniDelete()删除一行函数,但其是对于标准INI文件的。无奈只好改变ini文件格式:关键字由'|'分隔改为由'='分隔,于是对照afan老师出手http://www.autoitx.com/thread-44761-1-1.html         编写的函数__IniReadToArray()仿造一个,单独运行与老师的效果一样,然放在主程序里出匪夷所思问题(列数会变),当然老师的函数放那儿都行,特求afan老师出手帮忙!
标准ini:
非标ini:#include <_ini.au3>    ;_IniWrite()添加一行;_IniDelete()删除一行;_IniWriteSection()二维数组写入某字段;_IniRead()读取一行
#include <Array.au3>

$sIniFile = @ScriptDir & "\Config.ini"      ;'='分隔关键字的配置文件
$sIniFile1 = @ScriptDir & "\Config_1.ini"   ;'|'分隔关键字的配置文件
$Section = 'FastStart'

$slist1 = __IniReadToArray_fz($sIniFile, $Section) ;, $sDecimal)                        ;仿照afan老师的__IniReadToArray
_ArrayDisplay($slist1, 'fz')

$slist2 = __IniReadToArray($sIniFile1, $Section) ;, $sDecimal = '|')                     ;afan老师特编的函数
_ArrayDisplay($slist2, 'afan')



;===================读标准ini文件(键值中以'|'分隔)到二维数组及填充listview的函数,系根据afan老师的__IniReadToArray这个函数自编的=================
Func __IniReadToArray_fz($sIniFile, $Section, $sDecimal = '|')
                $aList = _IniReadSection($sIniFile, $Section) ;, $mode = 0)               ;读取整个字段内容
                Local $i = 1
                Local $aLine
                For $i = 1 to UBound($aList) - 1
                        $aLine[$i - 1] = $aList[$i] & $sDecimal & $aList[$i]
                Next
                $aLine == _ArrayDelete($aLine, UBound($aLine) - 1)                        ;删除最后一个空行
        _ArrayDisplay($aLine, '$aLine')                                                    ;截止这里与与afan老师的函数显示结果一样       
                ;If @error Then Return SetError(1)
                Local $i, $afg, $j, $iMax = 1, $iC = 1
                Local $aData[$iMax]
                For $i = 0 To UBound($aLine) - 1
                                $afg = StringSplit($aLine[$i], $sDecimal, 1)
                                For $j = 1 To $afg
                                                If $afg > $iMax Then
                                                                $iMax = $afg
                                                                ReDim $aData[$iMax]
                                                EndIf
                                                $aData[$i][$j - 1] = $afg[$j]
                                Next
                Next
                ReDim $aData[$iMax]
                Return $aData                               
EndFunc   ;==>__IniReadToArray__fz

;===================读'|'分隔符非标准ini文件成二维数组的函数 afan编写==================================
Func __IniReadToArray($sIniFile, $Section, $sDecimal = '|')
      ;ini文件路径      ;字段名      ;分隔符
      Local $sIni = FileRead($sIniFile)
      Local $_Section = StringRegExpReplace($Section, '^\h*(.+?)\h*, '$1')
      $_Section = StringRegExpReplace($_Section, '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)', '\\$1')
      $sIni = StringRegExpReplace($sIni, '(?mi)[\s\S]*?^\h*\[' & $_Section & '\]\V*\v+([\s\S]+?)(?=\r\n\h*\[|\z)[\s\S]*', '\1')
      Local $aLine = StringRegExp($sIni, '\V+', 3)
_ArrayDisplay($aLine, '$aLine')                                                ;截止这里显示的结果与仿照函数结果一样       
                If @error Then Return SetError(1)
      Local $i, $afg, $j, $iMax = 1, $iC = 1
      Local $aData[$iMax]
      For $i = 0 To UBound($aLine) - 1
                $afg = StringSplit($aLine[$i], $sDecimal, 1)
                For $j = 1 To $afg
                        If $afg > $iMax Then
                              $iMax = $afg
                              ReDim $aData[$iMax]
                        EndIf
                        $aData[$i][$j - 1] = $afg[$j]
                Next
      Next
      ReDim $aData[$iMax]
      Return $aData
EndFunc   ;==>__IniReadToArray

标准ini式样:
!=!tb|!jd|!ymx|!163|!gg1|!115|!116|!139|!aux|!auc|!ahk|!188|!efz|!efq|!xy|!oa|!pt|!gb|!gt|!lr|!yy|!bb
bd=Mozilla Firefox\firefox.exe|http://www.baidu.com/baidu?wd=%s&cl=3
gg=Mozilla Firefox\firefox.exe|https://www.google.com.hk/search?inlang=zh-CN&newwindow=1&safe=strict&hl=zh-CN&q=%s&oq=wome&gs_l=serp.3.2.0i2l10.17420.17986.0.20758.4.4.0.0.0.0.305.488.0j1j0j1.2.0....0...1c.1.45.serp..2.2.484.v3a8e3RZXxU

非标ini式样:
!|!tb|!jd|!ymx|!163|!gg1|!115|!116|!139|!aux|!auc|!ahk|!188|!efz|!efq|!xy|!oa|!pt|!gb|!gt|!lr|!yy|!bb
bd|Mozilla Firefox\firefox.exe|http://www.baidu.com/baidu?wd=%s&cl=3
gg|Mozilla Firefox\firefox.exe|https://www.google.com.hk/search?inlang=zh-CN&newwindow=1&safe=strict&hl=zh-CN&q=%s&oq=wome&gs_l=serp.3.2.0i2l10.17420.17986.0.20758.4.4.0.0.0.0.305.488.0j1j0j1.2.0....0...1c.1.45.serp..2.2.484.v3a8e3RZXxU

wangms 发表于 2014-8-4 20:41:27

自己顶一下,希望afan老师及各位高手看见。。。。

afan 发表于 2014-8-4 22:10:55

近段时间较忙,未回复相关帖子,抱歉~
修改了几处,试下Func __IniReadToArray_fz($sIniFile, $Section, $sDecimal = '|')
        Local $aList = _IniReadSection($sIniFile, $Section) ;, $mode = 0)               ;读取整个字段内容
        If @error Then Return SetError(1)
        Local $i, $aLine
        For $i = 1 To $aList
                $aLine[$i - 1] = $aList[$i] & $sDecimal & $aList[$i]
        Next
        ;_ArrayDisplay($aLine, '$aLine')
        Local $afg, $j, $iMax = 1, $iC = 1
        Local $aData[$iMax]
        For $i = 0 To UBound($aLine) - 1
                $afg = StringSplit($aLine[$i], $sDecimal, 1)
                For $j = 1 To $afg
                        If $afg > $iMax Then
                                $iMax = $afg
                                ReDim $aData[$iMax]
                        EndIf
                        $aData[$i][$j - 1] = $afg[$j]
                Next
        Next
        ReDim $aData[$iMax]
        Return $aData
EndFunc   ;==>__IniReadToArray_fz

wangms 发表于 2014-8-4 22:32:25

太谢谢老师啦!我先试试先。

wangms 发表于 2014-8-4 22:46:26

哎呀!我的妈呀!afan老师真是神人!经您轻描淡写一改,我那莫名其妙的问题消失啦,真似有妙手回春的感觉,再次谢谢老师!!!

wangms 发表于 2014-8-4 23:04:31

请教老师,为什么函数里放入   If @error Then Return SetError(1)   这个玩意,那莫名其妙问题就消失,是何道理? 不就是一个条件判断吗,深奥深奥
页: [1]
查看完整版本: 【已解决谢afan老师】仿造的函数问题出在哪儿呢?