|
楼主 |
发表于 2012-3-17 16:38:40
|
显示全部楼层
加上替换字符的转义,以防万一
afan 发表于 2012-3-15 20:14
找到耗时原因了,但不知如何解决:
测试 5 个 .txt 文件,分别为:
文件 1 需替换 4 行;
文件 2 需替换 8 行;
文件 3 需替换 13 行;
文件 4 需替换 4 行;
文件 5 需替换 11 行;
在你的代码中插入 MsgBox() 单步测试代码到第 15 行:Func _UDF1();定向搜索文本替换
Local $k, $i, $s0, $s1, $sFile
For $k = 0 To UBound($aWinAPIEx) - 1
$sFile = $aWinAPIEx[$k][2]
If $sFile = '' Or Not FileExists($sFile) Then ContinueLoop
Local $Str = String(FileRead($sFile)) ;将文件全部内容读入变量 $Str
Local $Str1 = $Str
For $i = 0 To UBound($aWinAPIEx) - 1
If $aWinAPIEx[$i][0] = '' Or $aWinAPIEx[$i][2] <> $sFile Then ContinueLoop
$s0 = StringRegExpReplace($aWinAPIEx[$i][0], '^\h*|\h*$', '') ; 对英文正则整理
$s1 = StringRegExpReplace($aWinAPIEx[$i][1], '\${|\$\d+|\\', '\\$0') ; 对中文正则整理
$Str = StringRegExpReplace($Str, '(?m)^\h*\Q' & $s0 & '\E\h*(?=\v|$)', $s1, 1);对变量 $Str(即整个文件)执行正则替换
MsgBox(262144,'替换后 ~' & $i,'测试变量:' & @lf & '$Str' & @lf & @lf & '变量返回:' & @lf & $Str & @lf & @lf & '@Error:' & @lf & @Error) ;### Debug MSGBOX
Next
If $Str = $Str1 Then ContinueLoop ;未替换一次
Local $hFO = FileOpen($sFile, 2) ; 写入打开文件
FileWrite($hFO, $Str) ; 将替换后的变量 $Str 的内容写入文件
FileClose($hFO) ;关闭打开的文件
Next
EndFunc ;==>_UDF1
测试报告:
文件 1 有 4 行替换, 代码内层 For 循环的 $i 值在 ( 0 -- 3 ) 之间连续循环, 重复 4 个周期 ( 0 -- 3 ),
但第一次的 $i( 0--3 ) 循环完成后, 在目录资源管理器中, 文件的修改日期立即变化到当前的日期时间;
此时打开文件 1 (脚本暂停在第 2 次循环开始处), 查看文件已正确完成替换!
其后的 3 次 $i( 0--3 ) 循环 , 目录资源管理器中文件的修改日期无任何变化!
第 4 次循环从 $i = 4 开始,处理文件 2
相应 $i 在 ( 4--11 ) 之间, 由于需 8 行替换, $i( 4--11 ) 连续重复 8 个周期循环,
文件的修改日期同文件 1 一样, 也是在第一次循环完成后立即变化!
其余 7 次为无功循环, (或是重复读写操作).
文件 3 在 $i = (12--24) 之间处理;
文件 4 在 $i = (25--29) 之间处理;
文件 5 在 $i = (30--40) 之间处理;
文件的改日期同文件 1 , 2 一样, 也是在第一次循环完成后立即变化! 其余循环看不出什么结果!
结论: 视文件需替换的行数决定 $i 的循环周期值;如文件 3 有 13 行替换, 相应 $i 分别为 (12--24) 13个值
行数又决定循环周期(如 12--24 )的重复次数,行数越多,重复循环也越多,
这个重复循环应该是在重复读写操作,也就是耗时长的原因吧!
试图用 For $i = 0 To _FileCountLines($sFile){返回当前文件行数} 循环,
结果 5 个文件只能完成 2 个后脚本退出!
说了这么多,不知你看明白没有? |
|