minbiao 发表于 2010-6-27 04:36:19

如何读取INI其中的数值,列出结果,用;隔开

比如1.ini中

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;


各位大大帮帮忙!谢谢...

www378660084 发表于 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
                $strArr=StringSplit($var[$i]," ")
      $str=$strArr & "="
                $result=$result & $str
                $strArr=StringSplit($var[$i]," ")
                $str=$strArr & $strArr & ";"
                $result=$result & $str
        Next
EndIf

MsgBox(4096, "", $result)

水木子 发表于 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+ +) ', 3)
For $i = 0 To UBound($aReg) - 1
        $sResult &= $aReg[$i] & ';'
Next
MsgBox(0, '结果', $sResult)

minbiao 发表于 2010-6-27 14:10:30

嘿嘿!谢谢两位大大!

minbiao 发表于 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
      $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
           $sText = FileRead($aFile[$i])
           $aReg = StringRegExp($sText, ': (\w+=\d+ +) ', 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

minbiao 发表于 2010-6-28 17:40:17

小弟在线等! 大大们帮帮忙!

afan 发表于 2010-6-28 18:31:11

本帖最后由 afan 于 2010-6-28 18:38 编辑

24和25行换个位置;
27行前面加一行 $sResult = ''

minbiao 发表于 2010-6-28 18:50:34

本帖最后由 minbiao 于 2010-6-28 19:27 编辑

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

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

OK啦! 谢谢afan大大!

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
        $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

minbiao 发表于 2010-6-28 19:31:47

明白!原来可以这么写! afan大大好厉害!

masterpcc 发表于 2010-6-28 20:15:30

新手!学习了!谢谢!!

minbiao 发表于 2010-6-30 16:04:16

本帖最后由 minbiao 于 2010-6-30 16:05 编辑

如果*.ini中

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+ +)', 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会乱,不知道应该如果处理好,望指教!

afan 发表于 2010-6-30 16:39:53

这个其实可以先用iniread读取键值再正则

水木子 发表于 2010-6-30 16:50:31

可能是我一来就直接用正则,误导了楼主的思路,实在抱歉啊!

minbiao 发表于 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;
页: [1] 2
查看完整版本: 如何读取INI其中的数值,列出结果,用;隔开