Excel 在VBA中逐行读取/分析文本文件

Excel 在VBA中逐行读取/分析文本文件,excel,vba,Excel,Vba,我正在尝试使用VBA解析文本文档,并返回文本文件中给定的路径。例如,文本文件如下所示: *Blah blah instructions *Blah blah instructions on line 2 G:\\Folder\...\data.xls D:\\AnotherFolder\...\moredata.xls 我希望VBA一次加载一行,如果它以*开头,则移动到下一行(类似于注释的那一行)。对于具有文件路径的行,我想将该路径写入单元格,例如第一个路径为A2,下一个路径为B2,等等 我希

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

*Blah blah instructions
*Blah blah instructions on line 2
G:\\Folder\...\data.xls
D:\\AnotherFolder\...\moredata.xls
我希望VBA一次加载一行,如果它以
*
开头,则移动到下一行(类似于注释的那一行)。对于具有文件路径的行,我想将该路径写入单元格,例如第一个路径为
A2
,下一个路径为
B2
,等等

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

  • 使用VBA读取文本文件的最佳/简单方法是什么
  • 我怎样才能一行一行地做

  • 对于文本文件的最基本读取,请使用
    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
    

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

    Dim fso As FileSystemObject: Set fso = New FileSystemObject
    Set txtStream = fso.OpenTextFile(filePath, ForReading, False)
    
    然后,使用这个
    txtStream
    对象,您可以使用intellisense拾取的各种工具(不同于使用
    FreeFile()
    方法),因此可以减少猜测。另外,你不必分配一个免费文件,并且希望它在分配后仍然是免费的

    您可以读取如下文件:

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

    注意:这需要参考Microsoft脚本运行时。

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

    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
    

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

    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
    

    下面是我从读取文本文件到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
    

    谢谢你的回复。我想这也能很好地实现我想要的。事实上,如果不将
    txtStream
    作为
    TextStream
    对象进行标注,就不会有智能感。这是正确的答案。您可以在FileSystemObject中执行相同的操作,但由于安全限制,FSO通常无法运行,而且速度要慢得多。。。。但是假设文件可以放入内存i’我来晚了一点,但是行输入与严格意义上的CR或CRLF组合(即LF本身)以外的任何东西都有问题——FSO没有这样的问题(但是是的,可能会稍微慢一点)记住结尾处的Close#FileNum!对于任何想知道的人:
    DataLine
    排除了终止
    CR
    CRLF
    (),因为错误是必需的。@NoChance,如果文件正如预期的那样,则不是,但编程风格不是问题的所在。你能以文本而不是图像的形式发布吗?jeffld,我上传了字符串