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

[AU3基础] 如何读取INI其中的数值,列出结果,用;隔开

 火.. [复制链接]
发表于 2010-6-27 04:36:19 | 显示全部楼层 |阅读模式
比如1.ini中
[VOD]
VOD|MOV1: MP3=2 GB D:\文件
VOD|MOV2: RM=512 MB D:\文件
VOD|MOV3: AVI=1 GB D:\文件
VOD|MOV4: MKV=256 MB D:\文件

如何读取其中的数值,列出为以下结果,用;隔开
MP3=2GB;RM=512MB;AVI=1GB;MKV=256MB;


各位大大帮帮忙!谢谢...
发表于 2010-6-27 07:19:06 | 显示全部楼层
$var = IniReadSection("1.ini", "VOD")
$result=""
If @error Then 
    MsgBox(4096, "", "Error occurred, probably no INI file.")
Else
    For $i = 1 To $var[0][0]
                $strArr=StringSplit($var[$i][0]," ")
        $str=$strArr[2] & "="
                $result=$result & $str
                $strArr=StringSplit($var[$i][1]," ")
                $str=$strArr[1] & $strArr[2] & ";"
                $result=$result & $str
        Next
EndIf

MsgBox(4096, "", $result)

评分

参与人数 2金钱 +20 贡献 +1 收起 理由
lynfr8 + 1
afan + 20

查看全部评分

发表于 2010-6-27 10:11:15 | 显示全部楼层
本帖最后由 水木子 于 2010-6-27 10:28 编辑

脚本 与 1.ini 同目录下运行
Local $sText, $sResult
$sText = FileRead('1.ini')
$aReg = StringRegExp($sText, ': (\w+=\d+ [A-Z]+) ', 3)
For $i = 0 To UBound($aReg) - 1
        $sResult &= $aReg[$i] & ';'
Next
MsgBox(0, '结果', $sResult)

评分

参与人数 2威望 +2 贡献 +1 收起 理由
lynfr8 + 1
afan + 2

查看全部评分

 楼主| 发表于 2010-6-27 14:10:30 | 显示全部楼层
嘿嘿!谢谢两位大大!
 楼主| 发表于 2010-6-28 14:53:55 | 显示全部楼层
本帖最后由 minbiao 于 2010-6-28 14:56 编辑

运用水木子大大给的代码,小弟写了一个批量处理的,但是遇到个问题,小弟新生,写的不好望指点!

#扫描'\文件'文件夹下的所有ini,列出VOD<>'1'的ini文件路径到'\Log.txt',读取'\Log.txt'所列出的文件路径,
  逐个进行处理,把结果输出到'\pcname.ini'中。

遇到一个问题,就是输出的结果会重叠到下一行,如:
[列表]
D盘.ini=MP3=2 GB;RM=1 GB;AVI=768 MB;MKV=512MB;
E盘.ini=MP3=2 GB;RM=1 GB;AVI=768 MB;MKV=512MB;MP3=3 GB;RM=5 GB;AVI=1 GB;MKV=1 GB;

D盘.ini的结果会写到E盘.ini的前面, 应该怎么解决呢?
-----------------------------------------
#include <File.au3>

$Dir = @ScriptDir & '\文件'
$File = _FileListToArray($Dir, '*.ini', 1)
If @error Then Exit MsgBox(48, "错误", "错误001!")
Local $sText, $sResult, $File
Dim $data = '', $txtFile = @ScriptDir & '\Log.txt', $aFile
For $i = 1 To $File[0]
        $s_File = $Dir & '\' & $File[$i]
        $val = IniRead($s_File, "VOD", "VOD", "")
        If $val <> '1' Then $data &= $s_File & @CRLF        
Next
     FileWrite($txtFile, $data)
    _FileReadToArray($txtFile, $aFile)
        
If $aFile = "" Then 
Exit
Else
      For $i = 1 To $aFile[0]
           $sText = FileRead($aFile[$i])
           $aReg = StringRegExp($sText, ': (\w+=\d+ [A-Z]+) ', 3)
                   For $ii = 0 To UBound($aReg) - 1
                            $sResult &= $aReg[$ii] & ';'
                            IniWrite(@ScriptDir & '\pcname.ini',"列表", $File[$i], $sResult)
                   Next        
        IniWrite($aFile[$i], "VOD", "VOD", "1")        
       Next
        FileClose(FileOpen(@ScriptDir & '\Log.txt', 2));清空Log文件
Endif
 楼主| 发表于 2010-6-28 17:40:17 | 显示全部楼层
小弟在线等! 大大们帮帮忙!
发表于 2010-6-28 18:31:11 | 显示全部楼层
本帖最后由 afan 于 2010-6-28 18:38 编辑

24和25行换个位置;
27行前面加一行 $sResult = ''
 楼主| 发表于 2010-6-28 18:50:34 | 显示全部楼层
本帖最后由 minbiao 于 2010-6-28 19:27 编辑

afan大大终于来了! 好马上试一下!

----------------------------------------------------------------------

OK啦! 谢谢afan大大!
发表于 2010-6-28 18:57:01 | 显示全部楼层
本帖最后由 afan 于 2010-6-28 19:46 编辑

第28证明那个临时文件log.txt实属多余~
#include <File.au3>

Dim $Dir = @ScriptDir & '\'
Dim $File = _FileListToArray($Dir, '*.ini', 1)
If @error Then Exit MsgBox(48, "错误", "未找到ini文件")
Dim $i, $val, $s_File, $sText, $aReg, $j
For $i = 1 To $File[0]
        $s_File = $Dir & '\' & $File[$i]
        $val = IniRead($s_File, "VOD", "VOD", "")
        If $val = '1' Then ContinueLoop
        $sText = FileRead($s_File)
        $aReg = StringRegExp($sText, '\:\h([^\h]+)\h([^\h]+)', 3)
        If @error Then ContinueLoop
        Local $sResult = ''
        For $j = 0 To UBound($aReg) - 2 Step 2
                $sResult &= $aReg[$j] & $aReg[$j + 1] & ';'
        Next
        IniWrite(@ScriptDir & '\pcname.ini', "列表", $File[$i], $sResult)
        IniWrite($s_File, "VOD", "VOD", "1")
Next

评分

参与人数 1金钱 +5 收起 理由
lynfr8 + 5 大家都要学习afan认真学学正则!

查看全部评分

 楼主| 发表于 2010-6-28 19:31:47 | 显示全部楼层
明白!原来可以这么写! afan大大好厉害!
发表于 2010-6-28 20:15:30 | 显示全部楼层
新手!学习了!谢谢!!
 楼主| 发表于 2010-6-30 16:04:16 | 显示全部楼层
本帖最后由 minbiao 于 2010-6-30 16:05 编辑

如果*.ini中
[VOD]
VOD|MOV1: MP3=2 GB D:\文件
VOD|MOV2: RM=512 MB D:\文件
VOD|MOV3: AVI=1 GB D:\文件
VOD|MOV4: MKV=256 MB D:\文件

Disk|Disk Drive1=982 GB (C;D)
Disk|Disk Drive2=238 GB (E;F)

Partition1=C: (NTFS) 29996 MB free 10168 MB
Partition2=D: (NTFS) 948992 MB free 248108 MB
Partition3=E: (NTFS) 199987 MB free 48776 MB
Partition4=F: (NTFS) 37869 MB free 19953 MB

---------------------------------------

加写两个:
$aReg2 = StringRegExp($sText, 'Disk Drive+\d+=(.*+) ', 3)
$aReg3 = StringRegExp($sText, 'Partition+\d+=.* (\d+ [A-Z]+)', 3)

如何让列出的结果为:
VODSer.ini
MOV=MP3=2GB;RM=512MB;AVI=1GB;MKV=256MB;
Disk=982 GB;238 GB
Partition=10168 MB;248108 MB;48776 MB;19953 MB;


小弟搞了很久没搞好,分别用了三个For来处理,问题是:
列出结果的MOV那行是正确的,Disk和Partition会乱,不知道应该如果处理好,望指教!
发表于 2010-6-30 16:39:53 | 显示全部楼层
这个其实可以先用iniread读取键值再正则
发表于 2010-6-30 16:50:31 | 显示全部楼层
可能是我一来就直接用正则,误导了楼主的思路,实在抱歉啊!
 楼主| 发表于 2010-6-30 17:00:40 | 显示全部楼层
能正则,我用三个for写会出现这样的结果:
MOV=MP3=2GB;RM=512MB;AVI=1GB;MKV=256MB;
Disk=982 GB;Partition=10168 MB;248108 MB;48776 MB;19953 MB;
;238 GB;
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 12:16 , Processed in 0.271311 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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