【问题标题】:How do I extract data from multiple text files, in respect to each individual filename?对于每个单独的文件名,如何从多个文本文件中提取数据?
【发布时间】:2019-11-11 10:55:34
【问题描述】:

我需要来自多个文本文件的一个值。这些文本文件以 5 位文件名存储在一个文件夹中(大约 1000 个文件),我想创建一个宏,它会扫描此文件夹中的文件子集,然后提取单个欧元值。

我已经完成了提取部分,但是我还不能通过不同的文件名循环这个过程,因为我对 VBA 还很陌生。

Sub ExtractData()
    Dim myFile As String, text As String, textline As String, Data As Integer, filename As String
    Dim myFolder As String

    myFolder = "C:\Folder\"
    filename = Range("A1").Value & ".txt"
    myFile = "C:\Folder\" & filename & ""

    Open myFile For Input As #1
    Do Until EOF(1)
        Line Input #1, textline
        text = text & textline
    Loop
    Close #1

    Data = InStr(text, "Euro")
    Range("B1").Value = Mid(text, Data + 6, 4)

End Sub

如果有人能指出我正确的方向,我将不胜感激。 问候

【问题讨论】:

标签: excel vba text-extraction


【解决方案1】:

您可以使用Scripting.FileSystemObject 迭代目标文件夹中的文件,使用Like 运算符验证文件名,然后照常从每个文件中获取值。

这应该可行:

Sub ExtractData()
    Dim folderPath As String, filePath As String
    Dim textline As String, data As Integer
    folderPath = "C:\Folder\"

    Dim oFso As Object: Set oFso = CreateObject("Scripting.FileSystemObject")
    Dim oFolder As Object: Set oFolder = oFso.GetFolder(folderPath)
    Dim oFiles As Object: Set oFiles = oFolder.Files
    Dim oFile As Object

    Dim counter As Integer
    For Each oFile In oFiles
        If Not oFile.Name Like "#####.txt" Then GoTo ContinueFor

        data = 0
        counter = counter + 1
        Range("A" & counter).Value = oFile.Name
        filePath = folderPath & oFile.Name

        Open filePath For Input As #1
            Do Until EOF(1) Or data > 0
                Line Input #1, textline
                data = InStr(textline, "Euro")
            Loop
        Close #1

        If data > 0 Then Range("B" & counter).Value = Mid(textline, data + 6, 4)
ContinueFor:
    Next
End Sub

这将从包含单词“Euro”的第一行中提取目标值。如果您尝试提取的值 not 在同一行中,您可以阅读整个文本(类似于您最初所做的),然后提取您想要的值:

Dim allText As String
' ...
' ...

Open filePath For Input As #1
    allText = Input(LOF(1), 1)
Close #1

data = InStr(allText, "Euro")
If data > 0 Then Range("B" & counter).Value = Mid(allText, data + 6, 4)

可能有更好的方法,但这完全取决于文件的结构(您没有显示)。例如,如果目标值在下一行,并且您知道它在该行中的位置,则可以使用上面的原始代码读取包含单词“Euro”的行,读取下一行,然后提取值.

【讨论】:

  • 非常感谢您的努力!这看起来是一个不错的解决方案,但还没有完全奏效。它只导致A列中所有文件的列表(#####.txt)。我试图弄清楚。你有什么建议吗?
  • @Julian 你确定这些文件中存在“欧元”吗?您试图获得的价值与“欧元”是否一致?
  • 你是对的,值确实在下一行,这就是它什么都不返回的原因。 h我将如何返回以下行?不过,再次感谢您的大力帮助!
猜你喜欢
  • 2019-11-18
  • 1970-01-01
  • 2018-07-24
  • 2015-11-08
  • 2016-08-15
  • 2013-11-27
  • 2020-11-20
  • 1970-01-01
  • 2013-08-07
相关资源
最近更新 更多