找回密码
 加入
搜索
查看: 6818|回复: 5

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

[复制链接]
发表于 2014-8-4 20:34:51 | 显示全部楼层 |阅读模式
本帖最后由 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[UBound($aList)]
                For $i = 1 to UBound($aList) - 1
                        $aLine[$i - 1] = $aList[$i][0] & $sDecimal & $aList[$i][1]
                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[UBound($aLine)][$iMax]
                For $i = 0 To UBound($aLine) - 1
                                $afg = StringSplit($aLine[$i], $sDecimal, 1)
                                For $j = 1 To $afg[0]
                                                If $afg[0] > $iMax Then
                                                                $iMax = $afg[0]
                                                                ReDim $aData[UBound($aData)][$iMax]
                                                EndIf
                                                $aData[$i][$j - 1] = $afg[$j]
                                Next
                Next
                ReDim $aData[UBound($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[UBound($aLine)][$iMax]
        For $i = 0 To UBound($aLine) - 1
                $afg = StringSplit($aLine[$i], $sDecimal, 1)
                For $j = 1 To $afg[0]
                        If $afg[0] > $iMax Then
                                $iMax = $afg[0]
                                ReDim $aData[UBound($aData)][$iMax]
                        EndIf
                        $aData[$i][$j - 1] = $afg[$j]
                Next
        Next
        ReDim $aData[UBound($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 ... 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 ... 2.2.484.v3a8e3RZXxU

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2014-8-4 20:41:27 | 显示全部楼层
自己顶一下,希望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[UBound($aList) - 1]
        For $i = 1 To $aList[0][0]
                $aLine[$i - 1] = $aList[$i][0] & $sDecimal & $aList[$i][1]
        Next
        ;_ArrayDisplay($aLine, '$aLine')
        Local $afg, $j, $iMax = 1, $iC = 1
        Local $aData[UBound($aLine)][$iMax]
        For $i = 0 To UBound($aLine) - 1
                $afg = StringSplit($aLine[$i], $sDecimal, 1)
                For $j = 1 To $afg[0]
                        If $afg[0] > $iMax Then
                                $iMax = $afg[0]
                                ReDim $aData[UBound($aData)][$iMax]
                        EndIf
                        $aData[$i][$j - 1] = $afg[$j]
                Next
        Next
        ReDim $aData[UBound($aData)][$iMax]
        Return $aData
EndFunc   ;==>__IniReadToArray_fz
 楼主| 发表于 2014-8-4 22:32:25 | 显示全部楼层
太谢谢老师啦!我先试试先。
 楼主| 发表于 2014-8-4 22:46:26 | 显示全部楼层
哎呀!我的妈呀!afan老师真是神人!经您轻描淡写一改,我那莫名其妙的问题消失啦,真似有妙手回春的感觉,再次谢谢老师!!!
 楼主| 发表于 2014-8-4 23:04:31 | 显示全部楼层
请教老师,为什么函数里放入     If @error Then Return SetError(1)   这个玩意,那莫名其妙问题就消失,是何道理? 不就是一个条件判断吗,深奥深奥
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 03:29 , Processed in 0.097747 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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