找回密码
 加入
搜索
查看: 2509|回复: 18

一次提取十几个文本的内容就会出错怎么办?(换新版本搞定)

[复制链接]
发表于 2009-9-19 12:25:37 | 显示全部楼层 |阅读模式
本帖最后由 lm099 于 2009-9-20 01:43 编辑

我的目的是从上百个文本的前300行里面提取出有关键字的行,输出到另外一个文本里面并用等号分隔,目前代码如下:
;批量处理文件,导出其中的配置信息
#Include <File.au3>

;选择一个或多个文本文件
Dim $strFiles = FileOpenDialog("选择一个或多个文本文件", "D:\everest\Reports"  & "" , "文本文档(*.ini)", 1+4)
If @error Or $strFiles = "" Then
        MsgBox(4096, "警告", "选择文件失败!")
        Exit
EndIf

;将多个文件路径分割
Dim $arrFileList = StringSplit($strFiles, "|")
;产生标准路径的文件名数组
Dim $arrFileList2 = $arrFileList
If $arrFileList[0]<>1 Then
        For $x = 1 to $arrFileList[0]-1
                $arrFileList2[$x] = $arrFileList[1] & "" & $arrFileList[$x+1]
        Next
        $arrFileList2[0] = $arrFileList2[0] - 1
EndIf

Dim $iFileIndex = 1
$file = FileOpen("D:\out.txt", 1)

For $iFileIndex = 1 To $arrFileList2[0]
        Dim $aRecords[301]
        If Not _FileReadToArray($arrFileList2[$iFileIndex],$aRecords) Then
                MsgBox(4096, "警告", "文件读入数组失败!")
                Exit
        EndIf
        Sleep(200)
        Sleep(200)
        For $x = 1 to 300
                If StringRegExp($aRecords[$x], '.*计算机名称.*|.*显示器.*|.*总计容量.*|.*主 IP 地址.*|.*主 MAC 地址.*|.*DMI 系统制造商.*|.*DMI 系统产品.*|.*DMI 系统序列号.*|.*原始时钟频率.*|.*物理内存\|总计.*', 0)  then
                        FileWrite ($file, $aRecords[$x] & '=')
                        Sleep(500)
                Endif
        Next
        FileWrite ($file, $arrFileList2[$iFileIndex])
        Sleep(500)
        FileWrite ($file, @CRLF)
        Sleep(500)
Next
        FileClose ($file)
        Sleep(1000)

RunWait(@ComSpec & " /c " & 'start D:\out.txt', "", @SW_HIDE)
本来是没有那么多Sleep的,后来发现多加几个延时出错率就低一点。

此脚本读取一个ini文本就没事,读取多个的时候就要看运气了,有时候两个都会出错,有时候十几个也能过,但是二十个就肯定不行了,出现错误如下:


需要处理的ini文本如下:

如果要帮忙的可以复制个几十份来测试,越多就越容易出现。

目前做过的测试如下:
1、将匹配的正则表达式改成只需要匹配一个字符串,问题依旧。
2、将匹配的判断去掉,即纯粹输出每一行,则可以通过。
3、只匹配,不输出,问题依旧。
……

其余的测试也做了不少,不过意义不大,反正问题应该是出在匹配那里,可是就是不知道哪有错误。还望指教!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2009-9-19 13:49:29 | 显示全部楼层
测试了,去掉了所有的sleep,我复制了60多个ini文件,也没见错误,1、2秒就完成了。
发表于 2009-9-19 13:52:49 | 显示全部楼层
又复制了256个ini测试,也没问题,5秒完成...
发表于 2009-9-19 14:00:55 | 显示全部楼层
好像我也遇到过同样的问题  现在还没解决
发表于 2009-9-19 14:03:49 | 显示全部楼层
又复制了....
算了,估计你某个ini有问题,而这两个ini没问题
 楼主| 发表于 2009-9-19 14:34:35 | 显示全部楼层
我也就是拿这两个ini复制出来测试的,其它的ini还没产生呢。。。

真是奇怪,现在我有时候读取一个文件也会出错了,都不知道怎么回事。我把本机360、防火墙之类能关的都关了也是这样。
发表于 2009-9-19 16:24:41 | 显示全部楼层
我的版本3.3.1.1
 楼主| 发表于 2009-9-19 18:09:36 | 显示全部楼层
我的是3.2.11.1.1,难道是这个原因?我去试试。
 楼主| 发表于 2009-9-19 18:55:13 | 显示全部楼层
奇怪的事情发生了:更换成最新版本后,开始几次还是不行,也没有错误提示直接退出了。后来可以运行通过了,但是发现其中有很多字符串匹配不到,例如我这么一段:
If StringRegExp($aRecords[$x], '.*计算机名称.*|.*显示器.*|.*总计容量.*|.*主 IP 地址.*|.*主 MAC 地址.*|.*DMI 系统制造商.*|.*DMI 系统产品.*|.*DMI 系统序列号.*|.*CPU 类型.*|.*系统内存.*', 0)  then
                        FileWrite ($file, $aRecords[$x] & '=')
                Endif
最后只产生了计算机名称、CPU 类型、系统内存这3个匹配到的字符串,实际上ini文本中可以找到上面所有的匹配内容,一个字都不错的,可是就是匹配不到。
 楼主| 发表于 2009-9-19 18:56:29 | 显示全部楼层
把第一句改成:
                If StringRegExp($aRecords[$x], '.*显示器.*', 0)  then
后,明明所有文本中都有显示器那一行,偏偏就是一个都不产生。真是奇哉怪也。
发表于 2009-9-19 19:01:26 | 显示全部楼层
本人去掉所有sleep,3.2.13.12.1及3310_1,3311_1,这3个版本,100个一下就完成。。。没出现什么错误,大概楼主的电脑有点不乐意干活,去别人的电脑试试
发表于 2009-9-19 19:02:43 | 显示全部楼层
out.txt的部分内容
计算机|计算机名称=TX=显示设备|显示器1=即插即用监视器 [NoDB] (0000000000000)=分区|总计容量=74.5 GB (18.6 GB 可用)=网络|主 IP 地址=132.97.194.112=网络|主 MAC 地址=00-E0-4C-58-4A-11=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\132-97-194-112.ini
计算机|计算机名称=TX2=显示设备|显示器1=Dell E151FPb [15" LCD] (6W41438I2V3U)=分区|总计容量=74.5 GB (47.0 GB 可用)=网络|主 IP 地址=132.97.194.115=网络|主 MAC 地址=00-E0-4C-58-BC-80=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\Copy (41) of 132-97-194-115.ini
计算机|计算机名称=TX2=显示设备|显示器1=Dell E151FPb [15" LCD] (6W41438I2V3U)=分区|总计容量=74.5 GB (47.0 GB 可用)=网络|主 IP 地址=132.97.194.115=网络|主 MAC 地址=00-E0-4C-58-BC-80=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\Copy of 132-97-194-115.ini
计算机|计算机名称=TX=显示设备|显示器1=即插即用监视器 [NoDB] (0000000000000)=分区|总计容量=74.5 GB (18.6 GB 可用)=网络|主 IP 地址=132.97.194.112=网络|主 MAC 地址=00-E0-4C-58-4A-11=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\132-97-194-112.ini
计算机|计算机名称=TX2=显示设备|显示器1=Dell E151FPb [15" LCD] (6W41438I2V3U)=分区|总计容量=74.5 GB (47.0 GB 可用)=网络|主 IP 地址=132.97.194.115=网络|主 MAC 地址=00-E0-4C-58-BC-80=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\132-97-194-115.ini
计算机|计算机名称=TX=显示设备|显示器1=即插即用监视器 [NoDB] (0000000000000)=分区|总计容量=74.5 GB (18.6 GB 可用)=网络|主 IP 地址=132.97.194.112=网络|主 MAC 地址=00-E0-4C-58-4A-11=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\Copy (2) of 132-97-194-112.ini
计算机|计算机名称=TX2=显示设备|显示器1=Dell E151FPb [15" LCD] (6W41438I2V3U)=分区|总计容量=74.5 GB (47.0 GB 可用)=网络|主 IP 地址=132.97.194.115=网络|主 MAC 地址=00-E0-4C-58-BC-80=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\Copy (2) of 132-97-194-115.ini
计算机|计算机名称=TX=显示设备|显示器1=即插即用监视器 [NoDB] (0000000000000)=分区|总计容量=74.5 GB (18.6 GB 可用)=网络|主 IP 地址=132.97.194.112=网络|主 MAC 地址=00-E0-4C-58-4A-11=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\Copy (3) of 132-97-194-112.ini
发表于 2009-9-19 19:04:23 | 显示全部楼层
我换台1998年的老电脑(够老的,没使得扔),一运行ini没一会就出现楼主的错误,可能是系统及配置问题吧,这台98年的电脑是Win XP SP1_CN      256MB内存      CPU 517MHZ


现在的是双核1.6G      2G内存   WinXP SP3_EN
发表于 2009-9-19 19:07:21 | 显示全部楼层
我修改你的源码。。。看看
;批量处理文件,导出其中的配置信息
#Include <File.au3>

;选择一个或多个文本文件
Dim $strFiles = FileOpenDialog("选择一个或多个文本文件", "D:\everest\Reports"  & "" , "文本文档(*.ini)", 1+4)
If @error Or $strFiles = "" Then
        MsgBox(4096, "警告", "选择文件失败!")
        Exit
EndIf

;将多个文件路径分割
Dim $arrFileList = StringSplit($strFiles, "|")
;产生标准路径的文件名数组
Dim $arrFileList2 = $arrFileList
If $arrFileList[0]<>1 Then
        For $x = 1 to $arrFileList[0]-1
                $arrFileList2[$x] = $arrFileList[1] & "" & $arrFileList[$x+1]
        Next
        $arrFileList2[0] = $arrFileList2[0] - 1
EndIf

Dim $iFileIndex = 1
$file = FileOpen("D:\out.txt", 1)

For $iFileIndex = 1 To $arrFileList2[0]
        Dim $aRecords[301]
        If Not _FileReadToArray($arrFileList2[$iFileIndex],$aRecords) Then
                MsgBox(4096, "警告", "文件读入数组失败!")
                Exit
        EndIf
        For $x = 1 to 300
                If StringRegExp($aRecords[$x], '.*计算机名称.*|.*显示器.*|.*总计容量.*|.*主 IP 地址.*|.*主 MAC 地址.*|.*DMI 系统制造商.*|.*DMI 系统产品.*|.*DMI 系统序列号.*|.*原始时钟频率.*|.*物理内存\|总计.*', 0)  then
                        FileWrite ($file, $aRecords[$x] & '=')
                Endif
        Next
        FileWrite ($file, $arrFileList2[$iFileIndex])
        FileWrite ($file, @CRLF)
Next
        FileClose ($file)

RunWait(@ComSpec & " /c " & 'start D:\out.txt', "", @SW_HIDE)
发表于 2009-9-19 19:09:24 | 显示全部楼层
我这仍然很正确,全部为完整匹配~
难不成真和电脑性能有关?这也许就可以解释sleep后的出错概率了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-7-3 08:58 , Processed in 0.079431 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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