【已解决谢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 自己顶一下,希望afan老师及各位高手看见。。。。 近段时间较忙,未回复相关帖子,抱歉~
修改了几处,试下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 太谢谢老师啦!我先试试先。 哎呀!我的妈呀!afan老师真是神人!经您轻描淡写一改,我那莫名其妙的问题消失啦,真似有妙手回春的感觉,再次谢谢老师!!! 请教老师,为什么函数里放入 If @error Then Return SetError(1) 这个玩意,那莫名其妙问题就消失,是何道理? 不就是一个条件判断吗,深奥深奥
页:
[1]