找回密码
 加入
搜索
查看: 10355|回复: 23

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

 火.. [复制链接]
发表于 2011-4-23 18:45:18 | 显示全部楼层 |阅读模式
本帖最后由 pchome2000 于 2011-4-24 17:03 编辑

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

关键字
$aa = abc

原有的ini文件的内容
[test]
a1 =  abc
a2 = aaaa

[ffffttt]
b1 = abc

[sdfsss]
c1 = cccccccccccccc
c2 = eeeeeeeeeeee


新的ini文件内容
[test]
a1 =  abc
a2 = aaaa

[ffffttt]
b1 = abc
发表于 2011-4-23 21:01:21 | 显示全部楼层
你怎么找到的,然后用对应的要素写就是了
发表于 2011-4-24 00:09:30 | 显示全部楼层
枚举,判断,写入
 楼主| 发表于 2011-4-24 11:23:39 | 显示全部楼层
如何枚举,可否举例 ,比如有1万行,如果用循环判断会好慢,请高手指教??
 楼主| 发表于 2011-4-24 11:35:26 | 显示全部楼层
回复 2# netegg

用ini函数可以找到,但系循环判断写入会好慢,比如有1万行或更多,几分钟至可以出结果
发表于 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[0]
                $var1 = IniReadSection(@ScriptDir & "\win.ini",$var0[$i0])
                        For $i1 = 1 To $var1[0][0]-1
                                If Not StringInStr($var1[$i1][1], "abc")  Then
                                        IniDelete(@ScriptDir & "\win.ini",$var0[$i0])
                                EndIf                                
                        Next                        
        Next
EndIf
 楼主| 发表于 2011-4-24 13:19:25 | 显示全部楼层
回复 6# 502762378

我原来的思路跟你差不多,但系ini文件有一万行或更多,会好慢才得出结果。
发表于 2011-4-24 13:55:41 | 显示全部楼层
$ini = IniReadSectionNames("config.ini")

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

_ArrayDisplay($ini_all)
$fin=_ArrayFindAll($ini_all,"1",0,0,0,0,1)
_ArrayDisplay($fin)
发表于 2011-4-24 13:56:13 | 显示全部楼层
本帖最后由 love5173 于 2011-4-24 13:59 编辑

(?s)(\[[^\[]+= abc[^\[]*)
试试满意不满意
用正则直接把相应的内容取出来
然后把数组转化字符串
把字符串写入新文件
代码懒得写了
发表于 2011-4-24 14:03:17 | 显示全部楼层
回复 8# 3mile
因为是根据数值来找字段,所以当成普通文本处理更好,ini的优势在楼主的要求不好体现
而且他是嫌弃速度慢,你认为呢
 楼主| 发表于 2011-4-24 14:08:48 | 显示全部楼层
本帖最后由 pchome2000 于 2011-4-24 14:11 编辑

回复 8# 3mile

config.ini文件的内容如下:
[test]
a1 =  abc
a2 = aaaa

[ffffttt]
b1 = abc

[sdfsss]
c1 = cccccccccccccc
c2 = eeeeeeeeeeee

用_ArrayFindAll 查找“abc” 的关键字的确是好快,但系结果变成:
[test]
a1 =  abc
[ffffttt]
b1 = abc

我想结果保留成这样:
[test]
a1 =  abc
a2 = aaaa
[ffffttt]
b1 = abc
发表于 2011-4-24 14:53:43 | 显示全部楼层
#include <array.au3>

$ini = IniReadSectionNames("config.ini")
 
Local $ini_all[1][3], $index = 1

For $i = 1 To $ini[0]
        $ini_section = IniReadSection("config.ini", $ini[$i])
        ReDim $ini_all[UBound($ini_section) + UBound($ini_all) - 1][3]
        For $k = 1 To $ini_section[0][0]
                $ini_all[$index][0] = $ini_section[$k][0]
                $ini_all[$index][1] = $ini_section[$k][1]
                $ini_all[$index][2] = $ini[$i]
                $index += 1
        Next
        $ini_all[0][0] = UBound($ini_all) - 1
Next
 
$fin=_ArrayFindAll($ini_all,"abc",0,0,0,0,1)
_ArrayDisplay($fin)
local $out_array[1],$num=0
for $n=0 to UBound($fin)-1
        ReDim $out_array[1+$num]
        $out_array[$num]=$ini_all[$fin[$n]][2]
        $num+=1
Next
$out_array=_ArrayUnique($out_array)

for $i=1 to $out_array[0]
        For $n = 1 To $ini[0]
      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
 楼主| 发表于 2011-4-24 16:34:51 | 显示全部楼层
谢谢各位,已经解决,谢谢。。。。。。。。。
发表于 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)

楼主测试下速度
发表于 2011-4-24 17:34:30 | 显示全部楼层
本帖最后由 love5173 于 2011-4-24 17:35 编辑

写了也没人看!伤心!
测试文件1050行
我的脚本用时172毫秒
3M的脚本5148毫秒
3M的脚本自带删除重复内容的功能
有好处也有坏处
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-1 07:59 , Processed in 0.081299 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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