pchome2000 发表于 2011-4-23 18:45:18

ini文件 如何查找匹配的字段,并写入新的ini文件???[已解决]

本帖最后由 pchome2000 于 2011-4-24 17:03 编辑

如何查找关键字 "abc"(关键字是预先知道),将匹配的字段写入新ini文件,不匹配的字段不写入新的ini文件。

关键字
$aa = abc

原有的ini文件的内容

a1 =abc
a2 = aaaa


b1 = abc


c1 = cccccccccccccc
c2 = eeeeeeeeeeee


新的ini文件内容

a1 =abc
a2 = aaaa


b1 = abc

netegg 发表于 2011-4-23 21:01:21

你怎么找到的,然后用对应的要素写就是了

3mile 发表于 2011-4-24 00:09:30

枚举,判断,写入

pchome2000 发表于 2011-4-24 11:23:39

如何枚举,可否举例 ,比如有1万行,如果用循环判断会好慢,请高手指教??

pchome2000 发表于 2011-4-24 11:35:26

回复 2# netegg

用ini函数可以找到,但系循环判断写入会好慢,比如有1万行或更多,几分钟至可以出结果

502762378 发表于 2011-4-24 11:48:16

回复 5# pchome2000
参考下
FileCopy(@WindowsDir & "\win.ini",@ScriptDir)
$var0 = IniReadSectionNames(@ScriptDir & "\win.ini")
If @error Then
        MsgBox(4096, "", "错误, 读取INI文件失败.")
Else
        For $i0 = 1 To $var0
                $var1 = IniReadSection(@ScriptDir & "\win.ini",$var0[$i0])
                        For $i1 = 1 To $var1-1
                                If Not StringInStr($var1[$i1], "abc")Then
                                        IniDelete(@ScriptDir & "\win.ini",$var0[$i0])
                                EndIf                               
                        Next                       
        Next
EndIf

pchome2000 发表于 2011-4-24 13:19:25

回复 6# 502762378

我原来的思路跟你差不多,但系ini文件有一万行或更多,会好慢才得出结果。

3mile 发表于 2011-4-24 13:55:41

$ini = IniReadSectionNames("config.ini")

Local $ini_all, $index = 1
For $i = 1 To $ini
        $ini_section = IniReadSection("config.ini", $ini[$i])
        ReDim $ini_all
        For $k = 1 To $ini_section
                $ini_all[$index] = $ini_section[$k]
                $ini_all[$index] = $ini_section[$k]
                $ini_all[$index] = $ini[$i]
                $index += 1
        Next
        $ini_all = UBound($ini_all) - 1
Next

_ArrayDisplay($ini_all)
$fin=_ArrayFindAll($ini_all,"1",0,0,0,0,1)
_ArrayDisplay($fin)

love5173 发表于 2011-4-24 13:56:13

本帖最后由 love5173 于 2011-4-24 13:59 编辑

(?s)(\[[^\[]+= abc[^\[]*)
试试满意不满意
用正则直接把相应的内容取出来
然后把数组转化字符串
把字符串写入新文件
代码懒得写了

love5173 发表于 2011-4-24 14:03:17

回复 8# 3mile
因为是根据数值来找字段,所以当成普通文本处理更好,ini的优势在楼主的要求不好体现
而且他是嫌弃速度慢,你认为呢

pchome2000 发表于 2011-4-24 14:08:48

本帖最后由 pchome2000 于 2011-4-24 14:11 编辑

回复 8# 3mile

config.ini文件的内容如下:

a1 =abc
a2 = aaaa


b1 = abc


c1 = cccccccccccccc
c2 = eeeeeeeeeeee

用_ArrayFindAll 查找“abc” 的关键字的确是好快,但系结果变成:

a1 =abc

b1 = abc

我想结果保留成这样:

a1 =abc
a2 = aaaa

b1 = abc

3mile 发表于 2011-4-24 14:53:43

#include <array.au3>

$ini = IniReadSectionNames("config.ini")

Local $ini_all, $index = 1

For $i = 1 To $ini
      $ini_section = IniReadSection("config.ini", $ini[$i])
      ReDim $ini_all
      For $k = 1 To $ini_section
                $ini_all[$index] = $ini_section[$k]
                $ini_all[$index] = $ini_section[$k]
                $ini_all[$index] = $ini[$i]
                $index += 1
      Next
      $ini_all = UBound($ini_all) - 1
Next

$fin=_ArrayFindAll($ini_all,"abc",0,0,0,0,1)
_ArrayDisplay($fin)
local $out_array,$num=0
for $n=0 to UBound($fin)-1
        ReDim $out_array
        $out_array[$num]=$ini_all[$fin[$n]]
        $num+=1
Next
$out_array=_ArrayUnique($out_array)

for $i=1 to $out_array
        For $n = 1 To $ini
      if $out_array[$i]==$ini[$n] Then
                        $ini_section = IniReadSection("config.ini", $ini[$i])
                        IniWriteSection("out.ini",$out_array[$i],$ini_section)
                EndIf
        Next
Next

pchome2000 发表于 2011-4-24 16:34:51

谢谢各位,已经解决,谢谢。。。。。。。。。

love5173 发表于 2011-4-24 17:07:15

本帖最后由 love5173 于 2011-4-24 17:10 编辑

#Include <Array.au3>
$search="abc"
$file1="D:\UserFile\Desktop\111.ini"
$file2="D:\UserFile\Desktop\222.ini"
FileOpen($file1,0)
$txt1=FileRead($file1)
FileClose($file1)
$array=StringRegExp($txt1,'\[[^\[]+=\h*'&$search&'[^\[]+',3)
$txt2=_ArrayToString($array,"")
FileOpen($file2,10)
FileWrite($file2,$txt2)
FileClose($file2)

楼主测试下速度

love5173 发表于 2011-4-24 17:34:30

本帖最后由 love5173 于 2011-4-24 17:35 编辑

写了也没人看!伤心!
测试文件1050行
我的脚本用时172毫秒
3M的脚本5148毫秒
3M的脚本自带删除重复内容的功能
有好处也有坏处
页: [1] 2
查看完整版本: ini文件 如何查找匹配的字段,并写入新的ini文件???[已解决]