lm099 发表于 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<>1 Then
        For $x = 1 to $arrFileList-1
                $arrFileList2[$x] = $arrFileList & "\" & $arrFileList[$x+1]
        Next
        $arrFileList2 = $arrFileList2 - 1
EndIf

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

For $iFileIndex = 1 To $arrFileList2
        Dim $aRecords
        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、只匹配,不输出,问题依旧。
……

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

afan 发表于 2009-9-19 13:49:29

测试了,去掉了所有的sleep,我复制了60多个ini文件,也没见错误,1、2秒就完成了。

afan 发表于 2009-9-19 13:52:49

又复制了256个ini测试,也没问题,5秒完成...

刘强 发表于 2009-9-19 14:00:55

好像我也遇到过同样的问题现在还没解决

afan 发表于 2009-9-19 14:03:49

又复制了....
算了,估计你某个ini有问题,而这两个ini没问题

lm099 发表于 2009-9-19 14:34:35

我也就是拿这两个ini复制出来测试的,其它的ini还没产生呢。。。

真是奇怪,现在我有时候读取一个文件也会出错了,都不知道怎么回事。我把本机360、防火墙之类能关的都关了也是这样。

afan 发表于 2009-9-19 16:24:41

我的版本3.3.1.1

lm099 发表于 2009-9-19 18:09:36

我的是3.2.11.1.1,难道是这个原因?我去试试。

lm099 发表于 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文本中可以找到上面所有的匹配内容,一个字都不错的,可是就是匹配不到。

lm099 发表于 2009-9-19 18:56:29

把第一句改成:
                If StringRegExp($aRecords[$x], '.*显示器.*', 0)then
后,明明所有文本中都有显示器那一行,偏偏就是一个都不产生。真是奇哉怪也。

kn007 发表于 2009-9-19 19:01:26

本人去掉所有sleep,3.2.13.12.1及3310_1,3311_1,这3个版本,100个一下就完成。。。没出现什么错误,大概楼主的电脑有点不乐意干活,去别人的电脑试试

kn007 发表于 2009-9-19 19:02:43

out.txt的部分内容计算机|计算机名称=TX=显示设备|显示器1=即插即用监视器 (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 (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 (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=即插即用监视器 (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 (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=即插即用监视器 (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 (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=即插即用监视器 (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

kn007 发表于 2009-9-19 19:04:23

我换台1998年的老电脑(够老的,没使得扔),一运行ini没一会就出现楼主的错误,可能是系统及配置问题吧,这台98年的电脑是Win XP SP1_CN      256MB内存      CPU 517MHZ


现在的是双核1.6G      2G内存   WinXP SP3_EN

kn007 发表于 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<>1 Then
      For $x = 1 to $arrFileList-1
                $arrFileList2[$x] = $arrFileList & "\" & $arrFileList[$x+1]
      Next
      $arrFileList2 = $arrFileList2 - 1
EndIf

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

For $iFileIndex = 1 To $arrFileList2
      Dim $aRecords
      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)

afan 发表于 2009-9-19 19:09:24

我这仍然很正确,全部为完整匹配~
难不成真和电脑性能有关?这也许就可以解释sleep后的出错概率了
页: [1] 2
查看完整版本: 一次提取十几个文本的内容就会出错怎么办?(换新版本搞定)