使用VBScript筛选日志文件中的数据
我必须分析存储在“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,使用VBScript筛选日志文件中的数据,vbscript,Vbscript,我必须分析存储在“C:\read”目录中的日志文件中的数据,并将数据输出到系统中。有多个日志文件,名称为“drivermonitor”。日志文件包含设备名称、lotid、套接字和晶圆结果。每个器件具有不同的插座数量和三种不同的晶圆结果。过滤器数据从“Bin2测试开始”开始,该日志文件的晶圆结果为B20000A1、B20000A2、B20000B2 Drivermonitor日志文件示例: File c:\winapps\mbi\logs\ZLMH20N4FJ00N69HTTM045SP1REB1
编辑:重新构建代码
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@sapkokludevnames.Exists(devname)
如果变量devname
的值在字典devnames
中作为键存在,则返回True;如果缺少这样的键,则返回False。可能。但我建议你从我在回答中概述的要点开始。我已经重新构建了代码,但它不起作用@AnsgarWiechersI不会为你调试300 LoC,特别是不会用“它不起作用”这样的问题描述。我已经要求您将代码缩减为一个。更具体地说,把你的问题分解成具体的任务。让每个单独的任务都正常工作。然后组合代码。例如,处理头->处理CSV部分->处理一个文件->处理多个文件。