我一直在谷歌搜索这一天,但由于我没有VBA技能,我找不到任何正常工作的东西,我可以适应我的需要。
我有一个包含大约4500个文本文件的文件夹,在我们处理的计算机上运行硬件测试的输出。文本文件有很多我不需要的信息。我需要的是将所有这些文件导入到一个电子表格中,然后将它们分解为3个所需的字段 - 并且以易于阅读的方式进行解析。
我很难找到导入文本文件的VBA宏而没有错误我无法通过。我确实找到了以下一个,但是它被设置为在文件中查找第二列,在我的情况下,它会搞砸输入的数据并抛出所有地方的值(认为次要格式化问题时间为4500条记录)。 / p>
这是宏:
Sub test()
Dim myDir As String, fn As String, ff As Integer, txt As String
Dim delim As String, n As Long, b(), flg As Boolean, x
myDir = "c:\test" '<- change to actual folder path
delim = vbTab '<- delimiter (assuming Tab delimited)
Redim b(1 To Rows.Count, 1 To 2)
fn = Dir(myDir & "\*.txt")
Do While fn <> ""
ff = FreeFile
Open myDir & "\" & fn For Input As #ff
Do While Not EOF(ff)
Line Input #ff, txt
x = Split(txt, delim)
n = n + 1
If Not flg Then b(n,2) = fn
If UBound(x) > 0 Then
b(n,1) = x(1)
End If
flg = True
Loop
Close #ff
flg = False
fn = Dir()
Loop
ThisWorkbooks.Sheets(1).Range("a1").Resize(n,2).Value = b
End Sub
以下是其中一个文本文件的示例:
ILPN Number: I01128204
MAC Address: E0DB55820F85
Hardware:
CPU:Intel(R) Core(TM) i3-2370M CPU @ 2.40GHz
MOTHERBOARD:Dell Inc. - 0G8TPV - A02
BIOS VERSION/DATE:A02 - 08/15/2012
RAM DETECTED:4096 MB (BANK 0: 0/DDR3/1333 - BANK 2: 0/Unknown/0)
MANUFACTURER:Dell Inc.
PRODUCT:Inspiron 3520
SERIAL:B1JW9V1
NIC SPEED/NAME:100 Mbps - Realtek PCIe FE Family Controller, V:8.1
GRAPHIC RES:1366 x 768 (32 bits)
OPTIC DRIVE:HL-DT-ST, DVD+-RW GT80N , A103 (E:)
FIXED DISK:ST500LM012 HN-M500MBB - 465.76 GB (C: - GPT)
- 0.00 GB (D: - MBR)
WINPE:Microsoft Windows 8 Ultimate Edition, 32-bit (build 9200)
Module 126: Result: Ok
Initializing module version='1.0.0.17' with ''
Module Initialization done.
Starting module with: Param1=0x00010010 - Param2=0xFFFF0000
Module start: 14/05/2013 10:38:40
Set language module to: en-US
Found disk: 0 - 'ST500LM012 HN-M500MBB'
All PHYSICALDRIVE will be used as valid target...
Module started properly.
Cleaning element 'Disk ID: 0 - Model: ST500LM012 HN-M500MBB - Size: 465.762 GB' with algorithm 'Basic (random)'...
Clean process Successful
Process took 6099 sec to clean 476940.02MB ~ 78.20 MB/Sec
Closing module with code '1'...
Closing module done with result '0'
Releasing module...
Releasing module done at: 14/05/2013 12:20:19
所以,从这一切开始,我需要提取“ILPN号码”,MAC地址以及“模块126:结果正常”的行。其他一切都可以消失。如果我可以使用三个值的列对其进行排序,然后将每个记录放在自己的行中,那将是很好的。
这可能是一个两步过程。这两种解决方案都非常有用。谢谢!
答案 0 :(得分:1)
用于将多个输入文件中的三行读入Excel工作表的VBScript可能如下所示:
Set xl = CreateObject("Excel.Application")
xl.Visible = True
Set wb = xl.Workbooks.Add
Set ws = wb.Sheets(1)
row = 1
ws.Cells(row, 1).Value = "ILPN"
ws.Cells(row, 2).Value = "MAC Address"
ws.Cells(row, 3).Value = "Module 126"
Set fso = CreateObject("Scripting.FileSystemObject")
For Each f In fso.GetFolder("C:\your\folder").Files
If LCase(fso.GetExtensionName(f.Name)) = "txt" Then
row = row + 1
Set stream = f.OpenAsTextStream
ws.Cells(row, 1).Value = Trim(Split(stream.ReadLine, ":")(1))
ws.Cells(row, 2).Value = Trim(Split(stream.ReadLine, ":")(1))
Do Until stream.AtEndOfStream
line = stream.ReadLine
If Left(line, 10) = "Module 126" Then
ws.Cells(row, 3).Value = Trim(Split(line, ":")(2))
Exit Do
End If
Loop
stream.Close
End If
Next
wb.SaveAs "C:\some\folder\output.xls", -4143, , , , False
wb.Close
xl.Quit
作为VBA宏,以下内容应该有效:
Sub LoadDataFromFiles
row = 1
ActiveSheet.Cells(row, 1).Value = "ILPN"
ActiveSheet.Cells(row, 2).Value = "MAC Address"
ActiveSheet.Cells(row, 3).Value = "Module 126"
Set fso = CreateObject("Scripting.FileSystemObject")
For Each f In fso.GetFolder("C:\your\folder").Files
If LCase(fso.GetExtensionName(f.Name)) = "txt" Then
row = row + 1
Set stream = f.OpenAsTextStream
ActiveSheet.Cells(row, 1).Value = Trim(Split(stream.ReadLine, ":")(1))
ActiveSheet.Cells(row, 2).Value = Trim(Split(stream.ReadLine, ":")(1))
Do Until stream.AtEndOfStream
line = stream.ReadLine
If Left(line, 10) = "Module 126" Then
ActiveSheet.Cells(row, 3).Value = Trim(Split(line, ":")(2))
Exit Do
End If
Loop
stream.Close
End If
Next
ActiveWorkbook.Save
End Sub
答案 1 :(得分:0)
重述任务/问题:
鉴于文件夹中有大量结构化文本文件,从每个文件中提取三个(或三个?的倍数)数据项(ILPN编号,MAC地址,测试结果),并将它们作为行放在.txt /中。 csv文件,可以红色/导入Excel。
<强>观强>
循环遍历文件,将每个文件读入内存,使用RegExp解析/提取数据三元组,将它们写入输出文件;使用Excel打开输出文件,手动进行进一步操作。
<强>安排:强>
使用命令行中的VBScript来保持简单。
[如果你看起来很好,你可以回答这个问题“每个输入文件是否包含一个或多个信息三元组?”,我愿意为这个概念添加一些概念验证代码。] < / p>
等待时间:
鉴于您的其他信息,我相信@ Ansgar对您的输入数据的假设大多是正确的,我修复了代码中的两个拼写错误。因此,尝试通过启动“命令提示符”,创建/更改为合适的目录,将代码复制到文件中来表示他的脚本(+1),例如ansgar.vbs
- ,将文件夹/输出文件规范调整为您的需要,并通过cscript ansgar.vbs
运行它。
小改动 - 比如将整个“模块”行放入第3项
If Left(line, 10) = "Module 126" Then
ws.Cells(row, 3).Value = Trim(Split(line, ":")(2))
==>
If Left(line, 7) = "Module " Then
ws.Cells(row, 3).Value = line
不难。如果幸运的话,你的问题就解决了。
更新(wrt comment / subscript):
我认为
ws.Cells(row, 3).Value = Trim(Split(line, ":")(2))
行是责备。 “:”上的Split()应该分割输入行,如
Module 126: Result: Ok
成三个元素的数组“Module 126”,“Result”和“Ok”编号/索引/下标从0到2.如果Split()没有得到两个:行中的分隔符, 结果数组较小,对元素#2的访问将失败。
您必须将Split()的返回值分配给变量,检查数组的大小(UBound),查看错误的行,并决定是忽略它们还是更改保护If条件。