2012-07-17 47 views
33

Estoy tratando de analizar un documento de texto utilizando VBA y devolver la ruta dada en el archivo de texto.
Por ejemplo, el archivo de texto se vería así:Leer/Analizar archivo de texto línea por línea en VBA

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

Quiero que el VBA para cargar 1 línea a la vez, y si comienza con un * luego pasar a la siguiente línea (similar a la línea que se está comentado). Para las líneas con una ruta de archivo, quiero escribir ese camino a la celda, por ejemplo A2 por primera ruta, B2 para la siguiente, etc.

Las principales cosas que estaba esperando tener respuesta fueron:
1. ¿Cuál es la mejor/simple forma de leer un archivo de texto usando VBA?
2. ¿Cómo puedo hacer eso línea por línea?

Respuesta

51

para la lectura más básica de un archivo de texto, utilice open

ejemplo:

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

Soy una un poco tarde para la fiesta, pero Line Input tiene problemas con otra cosa que no sea estrictamente una combinación CR o CRLF (es decir, LF por sí misma) - FSO no tiene tales problemas (pero sí, es probablemente un poco más lento) –

+10

Recuerde Cerrar #FileNum ¡al final! –

+1

Para cualquier otra persona que se pregunte: 'DataLine' excluye la terminación' CR' o 'CRLF' ([fuente] (https://msdn.microsoft.com/en-us/library/aa243392%28v=vs.60%29. aspx)) – Felipe

26

encuentro FileSystemObject con una TxtStream la forma más fácil de leer archivos

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

Entonces con este objeto txtStream tiene todo tipo de herramientas que intellisense capta (a diferencia del método FreeFile()) por lo que hay menos gue sswork. Además, no tienes que asignar un archivo FreeFile y esperar que siga siendo gratuito desde que lo asignaste.

Usted puede leer un archivo como:

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

NOTA: Esto requiere una referencia a Microsoft Scripting Runtime.

+0

gracias por la respuesta Brad. Creo que esto también logrará lo que yo quería muy bien – dancran

+3

En realidad, sin dimensionar 'txtStream' como un objeto' TextStream', no habrá intellisense – ElRudi

23

Para completar; trabajando con los datos cargados en la memoria;

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

Esta es la respuesta correcta. Puede hacer lo mismo en FileSystemObject, pero FSO a menudo no se ejecutará debido a restricciones de seguridad, y es significativamente más lento. –

+2

... pero asume que el archivo cabe en la memoria –

4

Puede utilizar este código para leer línea por línea en el archivo de texto y también se puede comprobar sobre el primer carácter es "*", entonces se puede dejar que ..

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 
Cuestiones relacionadas