VBA从特定行开始读取大型Linux格式的文本文件,而无需将整个文件读入内存

时间:2018-12-10 14:54:01

标签: excel vba

我有一个大型的Linux格式(即换行符,换行符)文本文件,该文件是程序运行时的“状态”文件。程序运行时将更新此文件。它输出一些有用的消息和定期的标题信息,还输出用空格分隔的数字状态数据行。因为它是一款商业软件(Abaqus / Explicit),所以我无法做任何修改它写入此状态文件的方式。

我不久前写了一个VBA脚本,打开了文件,通过“ Input $”将其作为一个整体读取,通过“ Split(Data,vbLF)”将文件分成几行,并解析每一行以提取数字状态数据并将其放入Excel电子表格中,以供我查看和分析。问题在于,随着程序的继续运行,该文件变得越来越大,以至于无法将整个文件读入Excel。

我一直试图找到一种快速的方法,从我停下来的那一行开始读取文件,而不是将整个内容读到内存中。我试图将EOF()保存到电子表格上的“帮助”单元格,并将其与“搜索”和“线路输入”一起使用,以跳至我停下的位置,但是由于“线路输入”而无法正常工作无法将换行符识别为新行,只能识别回车符或回车换行符。

我花了一些时间浏览其他帖子,这似乎是唯一需要读取整个文件的其他解决方案。有人不知道如何在不读取整个文件的情况下完成此工作吗?

感谢您的时间!

1 个答案:

答案 0 :(得分:0)

'perhaps this could be modified for new start
Sub read_bookmark()

  Dim linein, tline, endmark, linevalid, filelen, fread
  Dim chx As Byte
  Dim fpath, mes, a



  On Error GoTo ErrHand



  mes = "Enter path & filename of Bookmark import file."

 'fpath = InputBox(mes, "", "c:\temp\bookmarks_12_8_18.html")
  fpath = "c:\temp\test.txt"

  If Len(fpath) = 0 Or (Len(Dir(fpath)) = 0) Then
    MsgBox ("File not found. Program canceled")
    End
  End If



  tline = ""
  linein = ""
  endmark = False
  linevalid = False


  Open fpath For Binary Access Read As #1

  filelen = LOF(1)    ' Get length of file.

  For fread = 1 To filelen


    Get #1, , chx



    If chx = 13 Or chx = 10 Then
       endmark = True
    ElseIf endmark = True Then      'wait till no more endmarks
        endmark = False
        tline = linein
        linevalid = True
        linein = Chr(chx)           'keep chr after endmarks
    Else
      linein = linein + Chr(chx)
    End If



    If linevalid = True Then

       'proc tline
       tline = ""
       linevalid = False

    End If


  Next
  'proc last linein chrs

  MsgBox ("Processing Complete")

Exit Sub

ErrHand:       ' Error-handling routine.
   Close #1
   MsgBox "Error in HTML read " + Error(Err)
   End

End Sub