VBA считывает большой текстовый файл в формате Linux, начиная с определенной строки, не считывая весь файл в память - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть большой текстовый файл в формате Linux (т. Е. Символ перевода строки для новой строки), который является файлом состояния для программы во время ее работы.Этот файл обновляется во время работы программы.Он выводит некоторые полезные сообщения и периодическую информацию заголовка, а также строки числовых данных о состоянии, разделенных пробелами.Поскольку это коммерческое программное обеспечение (Abaqus / Explicit), я ничего не могу сделать, чтобы изменить способ записи в этот файл состояния.

Я недавно написал сценарий VBA, который открывает файл, читает егов целом через «Input $» разбивает файл на строки через «Split (Data, vbLF)» и анализирует каждую строку, чтобы извлечь числовые данные о состоянии и поместить их в электронную таблицу Excel для просмотра и анализа.Проблема заключается в том, что, поскольку программа продолжает работать, этот файл становится все больше и больше, и чтение целого файла в Excel становится непрактичным.

Я пытался найти быстрый способчитать файл, начиная со строки, на которой я остановился, не читая все это в память.Я попытался сохранить EOF () в ячейке «помощник» в электронной таблице и использовать ее с «Seek» и «Line Input», чтобы перейти прямо к месту, на котором я остановился, но это не сработает, потому что «Line Input»не распознает символ перевода строки как новую строку, только возврат каретки или возврат каретки-linefeed.

Я потратил некоторое время на просмотр других постов, и мне показалось, что единственные другие решения, необходимые для чтения всего файла в.У кого-нибудь есть идеи относительно того, как это можно сделать БЕЗ чтения всего файла в?

Спасибо за ваше время!

1 Ответ

0 голосов
/ 22 декабря 2018
'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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...