使用VBScript筛选日志文件中的数据

使用VBScript筛选日志文件中的数据,vbscript,Vbscript,我必须分析存储在“C:\read”目录中的日志文件中的数据,并将数据输出到系统中。有多个日志文件,名称为“drivermonitor”。日志文件包含设备名称、lotid、套接字和晶圆结果。每个器件具有不同的插座数量和三种不同的晶圆结果。过滤器数据从“Bin2测试开始”开始,该日志文件的晶圆结果为B20000A1、B20000A2、B20000B2 Drivermonitor日志文件示例: File c:\winapps\mbi\logs\ZLMH20N4FJ00N69HTTM045SP1REB1

我必须分析存储在“C:\read”目录中的日志文件中的数据,并将数据输出到系统中。有多个日志文件,名称为“drivermonitor”。日志文件包含设备名称、lotid、套接字和晶圆结果。每个器件具有不同的插座数量和三种不同的晶圆结果。过滤器数据从“Bin2测试开始”开始,该日志文件的晶圆结果为B20000A1、B20000A2、B20000B2

Drivermonitor日志文件示例:

File c:\winapps\mbi\logs\ZLMH20N4FJ00N69HTTM045SP1REB1_DriverMonitor.log Created: 5/05/2018 02:30:35 PM Primary Diag: Bol1M5_DRV_V045.s19, Bol1M5_Dut_V045_1.s19, N/A, N/A LOTID: ZLMH20N4FJ00N69HTTM045SP1REB1 Device Type: ENG-Bolero1M-4HR Bin2 Test Started at 5/5/2018 7:37:22 PM ZLMH20N4FJ00N69HTTM045SP1REB1,5/5/2018 7:37:22 PM,5/5/2018 7:37:37 PM,01119000090105,02140714160071,3,FACE00FF,02083208,02083208,02083208,02083208,FACE00FF,02083208,02083208,02083208,FACE00FF,02083208,02083208,FACE00FF,02083208,02083208,02083208,02083208,FACE00FF,FACE00FF,02083208,02083208,02083208,02083208,02083208,02083208,02083208,FACE00FF,FACE00FF,02083208,02083208,02083208,02083208,02083208,02083208,02083208,02083208,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,00300000,003FFCE8,0000875C,00300000,B20000A1, ZLMH20N4FJ00N69HTTM045SP1REB1,5/5/2018 7:37:22 PM,5/5/2018 7:37:37 PM,01119000090105,02140714160071,3,FACE00FF,000B2532,000B2904,000B2832,000A180C,FACE00FF,000A2F18,000A3125,000A1F25,FACE00FF,000A1E20,000A210B,FACE00FF,000B2833,000A2D18,000A3425,000A2916,FACE00FF,FACE00FF,000A2E2D,000A0D2C,000A110D,000A0E0C,000A102C,000A120D,000A2725,FACE00FF,FACE00FF,000A252D,000A0B2C,000A150E,000A260C,000A2431,000A270C,000A222C,000A1725,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,2001A5A5,B20000A2, ZLMH20N4FJ00N69HTTM045SP1REB1,5/5/2018 7:37:22 PM,5/5/2018 7:37:38 PM,01119000090105,02140714160071,3,FACE00FF,5A5A5A5A,5A5A5A5A,5A5A5A5A,5A5A5A5A,FACE00FF,5A5A5A5A,5A5A5A5A,5A5A5A5A,FACE00FF,5A5A5A5A,5A5A5A5A,FACE00FF,5A5A5A5A,5A5A5A5A,5A5A5A5A,5A5A5A5A,FACE00FF,FACE00FF,5A5A5A5A,5A5A5A5A,5A5A5A5A,5A5A5A5A,5A5A5A5A,5A5A5A5A,5A5A5A5A,FACE00FF,FACE00FF,5A5A5A5A,5A5A5A5A,5A5A5A5A,5A5A5A5A,5A5A5A5A,5A5A5A5A,5A5A5A5A,5A5A5A5A,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,FACE00FF,0839C922,001E9808,000AAE61,00000004,B20000B2,
编辑:重新构建代码

Option Explicit
Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject")
'dim outfile: Set outfile = objFSO.CreateTextFile("C:\Users\faeq\Desktop\BIN2 Missmatch\output\testdata.log",2,true)
'dim outfolder : Set outfolder = objFSO.GetFolder("C:\Users\faeq\Desktop\Dest ")
Dim objSTR, objEND, objTYP, objEXT, objKEY, objFILE, objKEY2
Dim  testfile,b,a,dateTime,dash,array,mambastr,sock,k,nine
dim  devnames,  line, Split
dim objConnection,objRecordSet,ConnectionString,bin2, m
dim waf1,waf2,waf3,waf4, waf5, waf6, waf7, waf8, waf9, waf10, waf11, waf12

objSTR = "C:\read" 'Folder to search through.
'objEND = "D:\SQLDEV\bin_miss_match\archive\" 'Folder to copy too.
objEXT = "log" 'do not include leading period '.' on the extension.
objTYP = "Text Document"
objKEY = "drivermonitor" 'keyword to search for along with the extension.
objKEY2 = "devicedata" 'keyword to search for along with the extension.

'-------------------------------------------------------------------------------
OpenADOObjects2

For Each objFILE in objFSO.GetFolder(objSTR).Files
    Set testfile = objFSO.OpenAsTextStream
    line = ""
    Do Until testfile.AtEndOfStream
        line= testfile.ReadLine

        set Split =new regexp
        set dateTime =new regexp
        set dash =new regexp
        set a =new regexp
        Set m = New regExp
        set nine = new regexp
        set line = new regexp
        Set re2 = New RegExp
        Set re = New regExp
        Set waf1 = New regExp
        Set waf2 = New regExp
        Set waf3 = New regExp
        Set waf4 = New regExp
        Set waf5 = New regExp
        Set waf6 = New regExp
        Set waf7 = New regExp
        Set waf8 = New regExp
        Set waf9 = New regExp
        Set waf10 = New regExp
        Set waf11 = New regExp
        Set waf12 = New regExp
        re.Pattern = "^Device\sType:\s(.*)"
        For Each m In re.Execute(line)
            devnames = m.Submatches(24)
        Next

        re2.Pattern = "^[^-]*-|-[^-]*$"
        re2.Global  = True
        devnames = re2.Replace(devnames, "")

        Set devnames = CreateObject("Scripting.Dictionary")

        devnames.Add "Bolero", True
        devnames.Add "Habanero", True
        devnames.Add "Spacebridge", True
        devnames.Add "Marlin", True
        devnames.Add "Torpedo", True
        devnames.Add "Calypso", True
        devnames.Add "Mamba", True
        devnames.Add "Mpc", True
        devnames.Add "Panther", True
        devnames.Add "Quasar", True
        devnames.Add "Swordfish", True
        devnames.Add "Batray", True
        devnames.Add "Bonito", True
        devnames.Add "Flipper", True
        devnames.Add "Jelly", True
        devnames.Add "Kipper", True
        devnames.Add "Knifefish", True
        devnames.Add "Sailfish", True
        devnames.Add "Snakefish", True
        devnames.Add "Yellowfin", True
        devnames.Add "Agave", True
        devnames.Add "Grusonia", True
        devnames.Add "Oroya", True

        For Each m In re.Execute(line)
            devnames = m.Submatches(24)
        Next

        bin2 = 0
        sock = 0

        dateTime.pattern = "[0-9]+/[0-9]+/[0-9]+\s[0-9]+:[0-9]+:[0-9]+\s(AM|PM)\s-\s(FLS|fls|FSL|fsl|KLM|klm)"
        dash.pattern = "-"
        dash.global = True
        waf1.pattern = ",000000A1,$"
        waf2.pattern = ",000000A2,$"
        waf3.pattern = ",000000B2,$"
        '---------------Group 1-------------------------
        waf4.pattern = ",B20000A1,$"
        waf5.pattern = ",B20000A2,$"
        waf6.pattern = ",B20000B2,$"
        '---------------Group 2-------------------------
        waf7.pattern = ",000000C1,$"
        waf8.pattern = ",000000C2,$"
        waf9.pattern = ",000000D2,$"
        '---------------Group 3-------------------------
        waf10.pattern = ",00A1,$"
        waf11.pattern = ",00C2,$"
        waf12.pattern = ",00D2,$"

        If devnames.Exists("Bolero") or devnames.Exists("Mpc")  Then
            sock = 55
        End If
        If devnames.Exists("Habanero") Then
            sock = 20
        End If
        If devnames.Exists("Marlin") or devnames.Exists("Torpedo") or devnames.Exists("Bonito") or devnames.Exists("Flipper") or devnames.Exists("Jelly") or devnames.Exists("Kipper") or devnames.Exists("Knifefish") or devnames.Exists("Sailfish") or devnames.Exists("Snakefish") or devnames.Exists("Yellowfin")Then
            sock = 72
        End If
        If devnames.Exists("Calypso") Then
            sock = 36
        End If
        If devnames.Exists("Mamba") or devnames.Exists("Spacebridge") Then
            sock = 28
        End If
        If devnames.Exists("Panther") or devnames.Exists("Quasar") Then
            sock = 40
        End If
        If devnames.Exists("Swordfish") or devnames.Exists("Batray")  Then
            sock = 60
        End If
        If devnames.Exists("Agave") Then
            sock = 128
        End If
        If devnames.Exists("Grusonia") or devnames.Exists("Oroya") Then
            sock = 120
        End If

        Do Until testfile.AtEndOfStream
            a = Split(testfile.ReadLine, ",")

            if (nine.test(a) = true) then
                bin2 = 1
            end if

            if (waf1.test(a) =true) then
                a = Split(testfile.ReadLine, ",")
                mamba
                'outfile.writeline mambastr
                additem
            end if

            if (waf2.test(a) =true) then
                a = Split(testfile.ReadLine, ",")
                mamba
                'outfile.writeline mambastr
                additem
            end if

            if (waf3.test(a) = true) then
                a = Split(testfile.ReadLine, ",")
                mamba
                'outfile.writeline mambastr
                additem
            end if

            if (waf4.test(a) =true and bin2 = 1) then '",B20000A1,$"
                a = Split(testfile.ReadLine, ",")
                mamba
                'outfile.writeline mambastr
                additem
            end if

            if (waf5.test(a) =true and bin2 = 1) then '",B20000A2,$"
                a = Split(testfile.ReadLine, ",")
                mamba
                'outfile.writeline mambastr
                additem
            end if

            if (waf6.test(a) =true and bin2 = 1) then '",B20000B2,$"
                a = Split(testfile.ReadLine, ",")
                mamba
                'outfile.writeline mambastr
                additem
            end if

            if (waf7.test(a) =true and bin2 = 1) then '",000000C1,$"
                a = Split(testfile.ReadLine, ",")
                mamba
                'outfile.writeline mambastr
                additem
            end if

            if (waf8.test(a) =true and bin2 = 1) then '",000000C2,$"
                a = Split(testfile.ReadLine, ",")
                mamba
                'outfile.writeline mambastr
                additem
            end if

            if (waf9.test(a) =true and bin2 = 1) then '",000000D2,$"
                a = Split(testfile.ReadLine, ",")
                mamba
                'outfile.writeline mambastr
                additem
            end if

            if (waf10.test(a) =true and bin2 = 1) then '",00A1,$"
                a = Split(testfile.ReadLine, ",")
                mamba
                'outfile.writeline mambastr
                additem
            end if

            if (waf11.test(a) =true and bin2 = 1) then '",00C2,$"
                a = Split(testfile.ReadLine, ",")
                mamba
                'outfile.writeline mambastr
                additem
            end if

            if (waf12.test(a) =true and bin2 = 1) then '",00D2,$"
                a = Split(testfile.ReadLine, ",")
                mamba
                'outfile.writeline mambastr
                additem
            end if
        loop
        v = a(UBound(a)-1)
    loop
next

CloseADOObject

Sub mamba
    if (sock = 28) then
        mambastr = ""
        For k=6 to 32
            mambastr= mambastr + a(k)&","
        next
        mambastr = mambastr + a(33)
    end if

    if (sock = 36) then
        mambastr = ""
        For k=6 to 40
            mambastr= mambastr + a(k)&","
        next
        mambastr = mambastr + a(41)
    end if

    if (sock = 55) then
        mambastr = ""
        For k=6 to 59
            mambastr=mambastr + a(k)&","
        next
        mambastr = mambastr + a(60)
    end if

    if (sock = 40) then
        mambastr = ""
        For k=6 to 44
            mambastr= mambastr + a(k)&","
        next
        mambastr = mambastr + a(45)
    end if

    if (sock = 60) then
        mambastr = ""
        For k=6 to 64
            mambastr=mambastr + a(k)&","
        next
        mambastr = mambastr + a(65)
    end if

    if (sock = 72) then
        mambastr = ""
        For k=6 to 76
            mambastr=mambastr + a(k)&","
        next
        mambastr = mambastr + a(77)
    end if
    if (sock = 20) then
        mambastr = ""
        For k=6 to 24
            mambastr=mambastr + a(k)&","
        next
        mambastr = mambastr + a(25)
    end if
    if (sock = 128) then
        mambastr = ""
        For k=6 to 132
            mambastr=mambastr + a(k)&","
        next
        mambastr = mambastr + a(133)
    end if
    if (sock = 120) then
        mambastr = ""
        For k=6 to 124
            mambastr=mambastr + a(k)&","
        next
        mambastr = mambastr + a(125)
    end if
end sub
testfile.Close

sub OpenADOObjects2
    Set objConnection = CreateObject("ADODB.connection")
    objConnection.ConnectionString = "Provider=SQLNCLI11; Server=192.168.30.11; Database=dbtest2; UID=sa; Pwd=Win32API"
    objConnection.Open
    set objRecordSet = CreateObject("ADODB.RecordSet")
    objRecordSet.Open "Select * from tbltest",objConnection,1,3

end sub

sub CloseADOObject
    objRecordSet.Close
    objConnection.Close
end sub

sub additem
    objRecordSet.AddNew
    objRecordSet("data")= a
    objRecordSet("sockstr")= mambastr
    objRecordSet.Update
end sub

这可能并不能真正回答您的问题(因为我首先不完全清楚您的问题是什么),但应该提供一些改进代码的一般指导原则

通常在处理CSV样式的文件时,最好的方法是逐行读取文件,拆分每行,然后根据结果数组中特定字段的值进行进一步处理

For Each f In objFSO.GetFolder(objSTR).Files
    Set testfile = f.OpenAsTextStream
    Do Until testfile.AtEndOfStream
        a = Split(testfile.ReadLine, ",")
        '...
        'further processing occurs here
        '...
    Loop
    testfile.Close
Next
要打开文件,无需先从
文件
对象获取完整路径,然后使用该路径调用
OpenTextFile
。您可以使用对象的
OpenAsTextStream
方法直接从
file
对象打开文本文件

如果您的文件格式是在CSV样式数据前面加上不同格式的标题,我建议您首先在单独的循环中处理该标题:

For Each f In objFSO.GetFolder(objSTR).Files
    Set testfile = f.OpenAsTextStream
    line = ""
    Do Until testfile.AtEndOfStream Or InStr(line, "Test Started at") > 0
        line = testfile.ReadLine
        '...
        'process headers here
        '...
    Loop
    Do Until testfile.AtEndOfStream
        a = Split(testfile.ReadLine, ",")
        '...
        'process CSV data here
        '...
    Loop
    testfile.Close
Next
使用单个正则表达式从标头部分提取设备类型:

Set re = New RegExp
re.Pattern = "^Device\sType:\s(.*)"
For Each m In re.Execute(line)
    devtype = m.Submatches(0)
Next
根据您的示例,变量
devtype
将包含值“ENG-Bolero1M-4HR”。您可以从该字符串中删除不需要的前缀和/或后缀,例如:

Set re2 = New RegExp
re2.Pattern = "^[^-]*-|-[^-]*$"
re2.Global  = True
devtype = re2.Replace(devtype, "")
v = a(UBound(a)-1)
上述内容将字符串“ENG-Bolero1M-4HR”更改为“Bolero1M”

使用字典将提取的字符串映射到其他值:

Set devtypes = CreateObject("Scripting.Dictionary")
devtypes.Add "Bolero1M", 55
...

nval = devtypes(devtype)
或基于价值的存在做出决策:

Set devtypes = CreateObject("Scripting.Dictionary")
devtypes.Add "Bolero1M", True
...

If devtypes.Exists(devtype) Then
    ...
End If
在CSV部分中,提取最后一个字段的值,如下所示:

Set re2 = New RegExp
re2.Pattern = "^[^-]*-|-[^-]*$"
re2.Global  = True
devtype = re2.Replace(devtype, "")
v = a(UBound(a)-1)

此外,如果发现自己在代码中重复执行相同(或非常类似)操作,则应考虑在过程或函数中包装这些操作。并对过程/函数/变量名称使用描述性名称。

请将这堵代码墙简化为一个示例,说明您所面临的问题。某些设备不能很好地使用此代码@AnsgarWiechers“工作不好”不是一个问题描述。你期望的行为是什么?你观察到的行为是什么?我们没有坐在你的电脑前。那有很多
RegExp
对象…为什么这么多?您可以在一个循环中处理各种参数,并且只需要一个
RegExp
对象。这是设备和晶圆结果的名称@LankymartIf devnames.Exists(devnames),这是正确的还是缺少“s”?如果devnames.Exists(devnames)?我正在尝试使用你的代码guidline@sapkoklu
devnames.Exists(devname)
如果变量
devname
的值在字典
devnames
中作为键存在,则返回True;如果缺少这样的键,则返回False。可能。但我建议你从我在回答中概述的要点开始。我已经重新构建了代码,但它不起作用@AnsgarWiechersI不会为你调试300 LoC,特别是不会用“它不起作用”这样的问题描述。我已经要求您将代码缩减为一个。更具体地说,把你的问题分解成具体的任务。让每个单独的任务都正常工作。然后组合代码。例如,处理头->处理CSV部分->处理一个文件->处理多个文件。