2012-07-17 39 views
33

Tôi đang cố gắng phân tích cú pháp tài liệu văn bản bằng VBA và trả về đường dẫn được đưa ra trong tệp văn bản.
Ví dụ, các tập tin văn bản sẽ trông như thế:Đọc/phân tích cú pháp dòng tệp văn bản theo dòng trong VBA

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

Tôi muốn VBA để tải 1 dòng tại một thời điểm, và nếu nó bắt đầu với một * sau đó di chuyển đến dòng kế tiếp (tương tự như dòng đó là nhận xét). Đối với các dòng với một đường dẫn tập tin, tôi muốn viết rằng đường dẫn đến tế bào, nói A2 cho đường dẫn đầu tiên, B2 cho tới vv

Những điều chính tôi đã hy vọng đã trả lời là:
1. Cách tốt nhất/đơn giản để đọc thông qua một tập tin văn bản bằng cách sử dụng VBA là gì?
2. Làm thế nào tôi có thể làm điều đó từng dòng?

Trả lời

51

cho đọc cơ bản nhất của một tập tin văn bản, sử dụng open

dụ:

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 
+7

tôi là một ít muộn cho bữa tiệc, nhưng Line Input có vấn đề với bất cứ điều gì khác hơn là một sự kết hợp CR hoặc CRLF (tức là LF) - FSO không có vấn đề như vậy (nhưng yeah, có lẽ là một chút chậm hơn) –

+10

Hãy nhớ Đóng #FileNum cuối cùng! –

+1

Đối với bất kỳ ai khác tự hỏi: 'DataLine' không bao gồm kết thúc' CR' hoặc 'CRLF' ([source] (https://msdn.microsoft.com/en-us/library/aa243392%28v=vs.60%29. aspx)) – Felipe

26

tôi tìm ra FileSystemObject với một TxtStream cách dễ nhất để đọc các file

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

Sau đó, với đối tượng txtStream này, bạn có tất cả các loại công cụ mà intellisense chọn lên (không giống như phương pháp FreeFile()) để có ít màu sắc hơn sswork. Thêm vào đó bạn không phải gán một FreeFile và hy vọng nó thực sự vẫn miễn phí kể từ khi bạn gán nó.

Bạn có thể đọc một tập tin như:

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

Chú ý: Điều này đòi hỏi một tham chiếu đến Microsoft Scripting Runtime.

+0

cảm ơn Brad đã trả lời. Tôi nghĩ rằng điều này cũng sẽ thực hiện những gì tôi muốn tốt – dancran

+3

Trên thực tế, không có thứ nguyên 'txtStream' như một đối tượng' TextStream', sẽ không có intellisense – ElRudi

23

Để hoàn chỉnh; làm việc với dữ liệu được nạp vào bộ nhớ;

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 
+1

Đây là câu trả lời đúng. Bạn có thể làm tương tự trong FileSystemObject, nhưng FSO thường sẽ không chạy do các hạn chế bảo mật và nó chậm hơn đáng kể. –

+2

... nhưng giả định tệp sẽ khớp với bộ nhớ –

4

Bạn có thể sử dụng mã này để đọc từng dòng trong tập tin văn bản và Bạn cũng có thể kiểm tra về nhân vật đầu tiên được "*" thì bạn có thể rời khỏi đó ..

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 
Các vấn đề liên quan