fuinei 发表于 2012-8-12 00:56:36

再次请教关于返回文本文件内含相同关键字行信息的问题

本帖最后由 fuinei 于 2012-8-12 00:59 编辑

各位好,7月27日曾发贴请教查找文件内容返回关键字除外特定列字符串重复所有行的内容(Link:http://www.autoitx.com/thread-33688-1-1.html)由于代码中包括正则和与数组相关的函数未能理解代码的意思,现遇到另外一个情况需根据附件中计算机名返回计算机名相同的行,参考afan版主的代码以2个附件为原始数据,返回结果中都存在一定的问题,希望各位可以指导一下,谢谢!
按照附件内容PCinfo1返回:
PC1        192.168.1.1
PC2        192.168.1.2
PC3        192.168.1.3
PC1        192.168.1.5
PC2        192.168.1.6
PC3        192.168.1.7
PCinfo2返回:
PC1        192.168.1.1
PC2        192.168.1.2
PC3        192.168.1.3
PC1        192.168.1.1
PC2        192.168.1.2
PC3        192.168.1.3#include <File.au3>
#include <Array.au3>

Local $Detailinfo,$LineDetailinfo,$Computer
Local $Detaillist = InputBox("InputBox","请输入Status文本文件名称","","",250,130)
Local $list = @ScriptDir & "\" & $Detaillist & ".txt"
$Result_log = @ScriptDir & "\" & $Detaillist & "_duplicatioin.xls"

If FileExists($list) = 1 then
        If _FileReadToArray($list,$Detailinfo) = 0 Then
                MsgBox(48,"Error","读取原始数据文件失败,程序将退出!")
                Exit       
        EndIf
Else
        MsgBox(48,"Error","无法找到原始数据文件,程序将退出!")
        Exit
EndIf

Local $sOut = 'ComputerName' & @TAB & 'IP_Address' & @CRLF

If @error Then MsgBox(48, '', '错误')
For $i = 1 To UBound($Detailinfo) - 1 Step 2
      If IsDeclared($Detailinfo[$i]) Then
                $sOut &= Eval($Detailinfo[$i]) & $Detailinfo[$i - 1] & @CRLF
                Assign($Detailinfo[$i], '')
      Else
                Assign($Detailinfo[$i], $Detailinfo[$i - 1] & @CRLF)
      EndIf
Next
$file = FileOpen($Result_log,1)
If $file = -1 Then
        MsgBox(48,"Error","无法打开日志文件,程序将退出!")
        Exit
EndIf
FileWrite($file, $sOut)
FileClose($file)
MsgBox(0, 'Info', '程序已运行完成,请查看日志!')

3mile 发表于 2012-8-13 09:50:41

#include <File.au3>
#include <Array.au3>

Local $Detailinfo,$LineDetailinfo,$Computer
Local $Detaillist = InputBox("InputBox","请输入Status文本文件名称","","",250,130)
Local $list = @ScriptDir & "\" & $Detaillist & ".txt"
$Result_log = @ScriptDir & "\" & $Detaillist & "_duplicatioin.xls"

If FileExists($list) = 1 then
    $str=FileRead($list)
        $array=StringRegExp($str&@CRLF,'(?m)(^.*\r\n)(?=[^\1]*\1)',4)
Else
        MsgBox(48,"Error","无法找到原始数据文件,程序将退出!")
    Exit
EndIf

Local $sOut=""
$sOut&=$Result_log&@CRLF

For $i=0 To UBound($array)-1
        $temp=$array[$i]
        For $n=0 To UBound($temp)-1
                $sOut&=$temp[$n]
        Next
Next

$file = FileOpen($Result_log,1)
If $file = -1 Then
      MsgBox(48,"Error","无法打开日志文件,程序将退出!")
      Exit
EndIf
FileWrite($file, $sOut)
FileClose($file)
MsgBox(0, 'Info', '程序已运行完成,请查看日志!')

fuinei 发表于 2012-8-14 17:02:25

回复 2# 3mile
谢谢指导,代码使用PCinfo1时返回的结果不正确并且我目前还不太了解正则,我折腾了很久目前使用以下代码可实现找到关键字重复的行,但代码的效率很低信息少时还好,信息量较大时执行(如7000行)需等待4分钟左右,不知各位有没有比较高效的返回重复行信息的方法呢?
#include <File.au3>
#include <Array.au3>

Local $Detailinfo,$Detailinfo_ex,$Duplicate = ""
Local $Detaillist = InputBox("InputBox","请输入Status文本文件名称","","",250,130)
Local $list = @ScriptDir & "\" & $Detaillist & ".txt"


;判断Datasource文件能否读取/能否找到
If FileExists($list) = 1 then
        If _FileReadToArray($list,$Detailinfo) = 0 Then
                MsgBox(48,"Error","读取数据源文件失败,程序将退出!")
                Exit       
        EndIf
Else
        MsgBox(48,"Error","无法找到数据源文件,程序将退出!")
        Exit
EndIf

;定义变量
$bound = UBound($Detailinfo)
Local $key[$bound]
Local $KeyName[$bound]
Local $Amount[$bound]

For $i = 1 To$Detailinfo
        $Detailinfo_ex = StringSplit($Detailinfo[$i],@TAB)
        $Key[$i] = $Detailinfo_ex
        $KeyName[$i] = $Detailinfo_ex
Next

For $i = 1 To $Detailinfo
        ;使用_Arrayfindall判断是否有重复记录
        $Result = _ArrayFindAll($KeyName,$key[$i],0,0,0,2)
        $bound = UBound($Result)
        If $Result = -1 Then
                $Amount[$i] = 1
        Else
                $Amount[$i] = $bound
        EndIf

        If $Amount[$i] > 1 Then
                $Duplicate &= "Line" & $i & @TAB & $Detailinfo[$i] & @CRLF
        EndIf
Next
       
MsgBox(0,"重复记录信息如下:",$Duplicate)

xms77 发表于 2012-8-14 18:42:16

回复 3# fuinei
只有正则才是最快的方法,几十万行才几秒钟,很给力的正则,可惜我不专啊!

fuinei 发表于 2012-8-16 21:22:34

请问有没有可实现该功能的且执行效率较高的UDF呢?
页: [1]
查看完整版本: 再次请教关于返回文本文件内含相同关键字行信息的问题