【问题标题】:Read/Parse text file line by line in VBA在 VBA 中逐行读取/解析文本文件
【发布时间】:2012-07-16 17:45:47
【问题描述】:

我正在尝试使用 VBA 解析文本文档并返回文本文件中给出的路径。例如,文本文件如下所示:

*Blah blah instructions
*Blah blah instructions on line 2
G:\\Folder\...\data.xls
D:\\AnotherFolder\...\moredata.xls

我希望 VBA 一次加载 1 行,如果它以 * 开头,则移动到下一行(类似于被注释的那一行)。对于带有文件路径的行,我想将该路径写入单元格,例如A2 用于第一个路径,B2 用于下一个路径,等等。

我希望回答的主要问题是:

  1. 使用 VBA 读取文本文件的最佳/简单方法是什么?
  2. 如何逐行执行?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    对于文本文件的最基本读取,请使用open

    示例:

    Dim FileNum As Integer
    Dim DataLine As String
    
    FileNum = FreeFile()
    Open "Filename" For Input As #FileNum
    
    While Not EOF(FileNum)
        Line Input #FileNum, DataLine ' read in data 1 line at a time
        ' decide what to do with dataline, 
        ' depending on what processing you need to do for each case
    Wend
    

    #Author note - 请停止添加 close #FileNum - 它已在 cmets 中解决,不需要作为对此答案的改进

    【讨论】:

    • 我参加聚会有点晚了,但是 Line Input 在严格意义上的 CR 或 CRLF 组合(即 LF 本身)之外的任何问题上都有问题 - FSO 没有这样的问题(但是,是的,可能会慢一点)
    • 记得最后关闭#FileNum!
    • 对于其他想知道的人:DataLine 不包括终止 CRCRLF (source)
    • ON ERROR 是必需的。
    • @NoChance,如果文件符合预期,则不是,而是编程风格不是问题所在。
    【解决方案2】:

    我发现带有 TxtStream 的 FileSystemObject 是读取文件的最简单方法

    Dim fso As FileSystemObject: Set fso = New FileSystemObject
    Set txtStream = fso.OpenTextFile(filePath, ForReading, False)
    

    然后,有了这个txtStream 对象,您就拥有了智能感知的各种工具(与使用FreeFile() 方法不同),因此减少了猜测。另外,您不必分配 FreeFile 并希望它在您分配后实际上仍然是免费的。

    您可以读取如下文件:

    Do While Not txtStream.AtEndOfStream
        txtStream.ReadLine
    Loop
    txtStream.Close
    

    注意:这需要参考 Microsoft Scripting Runtime。

    【讨论】:

    • 感谢布拉德的回复。我认为这也将完成我想要的就好了
    • 实际上,如果不将txtStream 标注为TextStream 对象,就不会有智能感知
    【解决方案3】:

    为了完整性;处理加载到内存中的数据;

    dim hf As integer: hf = freefile
    dim lines() as string, i as long
    
    open "c:\bla\bla.bla" for input as #hf
        lines = Split(input$(LOF(hf), #hf), vbnewline)
    close #hf
    
    for i = 0 to ubound(lines)
        debug.? "Line"; i; "="; lines(i)
    next
    

    【讨论】:

    • 这是正确答案。你可以在 FileSystemObject 中做同样的事情,但是 FSO 经常会因为安全限制而无法运行,而且速度要慢很多。
    • ...但假定文件将适合内存
    【解决方案4】:

    您可以使用此代码在文本文件中逐行读取,还可以检查第一个字符是否为“*”,然后您可以保留它..

    Public Sub Test()
    
        Dim ReadData as String
    
        Open "C:\satheesh\myfile\file.txt" For Input As #1
    
        Do Until EOF(1) 
           Line Input #1, ReadData 'Adding Line to read the whole line, not only first 128 positions
        If Not Left(ReadData, 1) = "*" then
           '' you can write the variable ReadData into the database or file
        End If 
    
        Loop
    
        Close #1
    
    End Sub
    

    【讨论】:

      【解决方案5】:

      以下是我从读取文本文件到 excel 文件的代码。

      Sub openteatfile()
      Dim i As Long, j As Long
      Dim filepath As String
      filepath = "C:\Users\TarunReddyNuthula\Desktop\sample.ctxt"
      ThisWorkbook.Worksheets("Sheet4").Range("Al:L20").ClearContents
      Open filepath For Input As #1
      i = l
      Do Until EOF(1)
      Line Input #1, linefromfile
      lineitems = Split(linefromfile, "|")
              For j = LBound(lineitems) To UBound(lineitems)
                  ThisWorkbook.Worksheets("Sheet4").Cells(i, j + 1).value = lineitems(j)
              Next j
          i = i + 1 
      Loop
      Close #1
      End Sub
      

      【讨论】:

      • 你可以用文字代替图片吗?
      • jeffld,我上传了字符串
      猜你喜欢
      • 2020-12-01
      • 2012-04-12
      • 1970-01-01
      • 2014-12-01
      • 2015-10-25
      • 2011-07-23
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多