Читать / анализировать текстовый файл построчно в VBA

45

Я пытаюсь разобрать текстовый документ с помощью 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
excel

4 ответа

58
Лучший ответ

для наиболее простого чтения текстового файла используйте 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
  • 8
    Я немного опаздываю на вечеринку, но у Line Input есть проблемы с чем-либо, кроме строго CR или CRLF-комбинации (т.е. LF сам по себе) - у FSO таких проблем нет (но да, возможно, немного медленнее)
  • 15
    Помните Закрыть #FileNum в конце!
Показать ещё 5 комментариев
33

Я нахожу FileSystemObject с TxtStream самым простым способом читать файлы

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

Затем с помощью этого объекта txtStream у вас есть всевозможные инструменты, которые intellisense выбирает (в отличие от метода FreeFile()), поэтому есть меньше догадок. Кроме того, вам не нужно назначать FreeFile и надеяться, что он на самом деле свободен, поскольку когда вы его назначили.

Вы можете прочитать файл, например:

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

ПРИМЕЧАНИЕ. Для этого требуется ссылка на исполняемый файл Microsoft Scripting Runtime.

  • 0
    спасибо за ответ бред. Я думаю, что это также выполнит то, что я хотел просто отлично
  • 5
    На самом деле, без определения размера txtStream как объекта TextStream не будет смысла
28

Для полноты; работа с данными, загруженными в память;

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
  • 2
    Это правильный ответ. Вы можете сделать то же самое в FileSystemObject, но FSO часто не запускается из-за ограничений безопасности, и это значительно медленнее.
  • 3
    ... но предполагает, что файл поместится в память
3

Вы можете использовать этот код для чтения строки за строкой в ​​текстовом файле, и вы также можете проверить, что первый символ "*", тогда вы можете оставить это.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню