0

我整天都在谷歌上搜索,但是由于我的 VBA 技能为零,我找不到任何可以正常工作并且可以适应我的需求的东西。

我有一个包含大约 4500 个文本文件的文件夹,其中包含在我们处理的计算机上运行的硬件测试的输出。文本文件有很多我不需要的信息。我需要的是将所有这些文件导入到一个电子表格中,然后将它们解析为每个所需的 3 个字段 - 并且以易于阅读的方式进行。

我什至很难找到一个 VBA 宏来导入文本文件而不会出现我无法通过的错误。我确实找到了以下内容,但是它被设置为在文件中查找第二列,在我的情况下,这会破坏输入的数据并在各处抛出值(想想次要格式问题乘以 4500 条记录)。

这是宏:

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:结果 OK”的行。其他一切都可以消失。如果我可以用三个值的列对它进行排序,然后将每条记录放在自己的行中,那就太好了。

这可能是一个两步过程。任何一种或两种解决方案都会非常有帮助。谢谢!

4

2 回答 2

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
于 2013-06-04T19:34:09.360 回答
0

重述任务/问题:

给定文件夹中的大量结构化文本文件,从每个文件中提取三个(或三个的倍数?)数据项(ILPN 编号、MAC 地址、测试结果)并将它们作为行放在 .txt/.csv 文件中可以通过/导入到 Excel 中变红。

主意:

循环文件,将每个文件读入内存,使用 RegExp 解析/提取数据三元组,将它们写入输出文件;使用 Excel 打开输出文件,手动进行进一步操作。

计划:

在命令行中使用 VBScript 可以让事情变得简单。

[如果这对您来说很好,并且您可以回答“每个输入文件是否包含一个或多个信息三元组?”的问题,我愿意为这个概念添加一些概念验证代码。]

当您等待时:

鉴于您的附加信息,我相信@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

不难。如果你幸运的话,你的问题就解决了。

更新(写评论/下标):

认为_

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 条件。

于 2013-06-04T19:33:47.557 回答