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 你怎么找到的,然后用对应的要素写就是了 枚举,判断,写入 如何枚举,可否举例 ,比如有1万行,如果用循环判断会好慢,请高手指教?? 回复 2# netegg
用ini函数可以找到,但系循环判断写入会好慢,比如有1万行或更多,几分钟至可以出结果 回复 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
回复 6# 502762378
我原来的思路跟你差不多,但系ini文件有一万行或更多,会好慢才得出结果。 $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:59 编辑
(?s)(\[[^\[]+= abc[^\[]*)
试试满意不满意
用正则直接把相应的内容取出来
然后把数组转化字符串
把字符串写入新文件
代码懒得写了 回复 8# 3mile
因为是根据数值来找字段,所以当成普通文本处理更好,ini的优势在楼主的要求不好体现
而且他是嫌弃速度慢,你认为呢 本帖最后由 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 #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 谢谢各位,已经解决,谢谢。。。。。。。。。 本帖最后由 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:35 编辑
写了也没人看!伤心!
测试文件1050行
我的脚本用时172毫秒
3M的脚本5148毫秒
3M的脚本自带删除重复内容的功能
有好处也有坏处
页:
[1]
2