2009-06-02 23 views
15

Tengo este código de macro en Microsoft Office Word 2003 que lee las líneas de un archivo de texto. Las líneas representan cada una un valor de cadena que necesito usar más adelante en el código.Leer líneas de un archivo de texto pero omita las dos primeras líneas

Sin embargo, las primeras dos líneas del archivo de texto contienen algunas cosas que no necesito. ¿Cómo puedo modificar el código para que omita las dos primeras líneas? El "Intellisense" dentro del editor de VBA en Word chupa dura por cierto ..

De todos modos, el código es como la siguiente

Dim sFileName As String 
Dim iFileNum As Integer 
Dim sBuf As String 
Dim Fields as String 

sFileName = "c:\fields.ini" 
''//Does the file exist? 
If Len(Dir$(sFileName)) = 0 Then 
    MsgBox ("Cannot find fields.ini") 
End If 

iFileNum = FreeFile() 
Open sFileName For Input As iFileNum 
Do While Not EOF(iFileNum) 
    Line Input #iFileNum, Fields 

    MsgBox (Fields) 

Y este código actualmente me da todas las líneas, y yo no lo hacen quiero los primeros dos.

Respuesta

30

Para que en todo Open <file path> For Input As <some number> cosa es tan 1990. También es lento y propenso a errores.

En su editor VBA, seleccione Referencias en el menú Herramientas y busque "Microsoft Scripting Runtime" (scrrun.dll) que debería estar disponible en casi cualquier máquina con XP o Vista. Está ahí, selecciónalo. Ahora usted tiene acceso a un (a mí por lo menos) solución bastante más robusto:

With New Scripting.FileSystemObject 
    With .OpenTextFile(sFilename, ForReading) 

     If Not .AtEndOfStream Then .SkipLine 
     If Not .AtEndOfStream Then .SkipLine 

     Do Until .AtEndOfStream 
      DoSomethingImportantTo .ReadLine 
     Loop 

    End With 
End With 
2

¿Puedo ser demasiado simplista?

Apenas añada el siguiente código:

Open sFileName For Input as iFileNum 
Line Input #iFileNum, dummy1 
Line Input #iFileNum, dummy2 
........ 

Sundar

+0

También querría comprobar EOF antes de usar cada una de estas entradas de línea –

+0

-1. Esto falla si el archivo tiene menos de dos líneas – Tomalak

+0

Funciona de alguna manera, excepto que tengo este bucle en la parte inferior que atraviesa todo el archivo de texto, buscando cada línea. Y como no colocamos las dos primeras líneas en una cadena ficticia, lo mismo ocurre en el siguiente ciclo. Es decir, omite cada segunda línea en el archivo de texto. Lo que no debería hacer. De hecho necesito que las líneas se inserten en una matriz, que puedo usar más adelante. –

3
Open sFileName For Input As iFileNum 

Dim LineNum As Long 
LineNum = 0 

Do While Not EOF(iFileNum) 
    LineNum = LineNum + 1 
    Line Input #iFileNum, Fields 
    If LineNum > 2 Then 
    DoStuffWith(Fields) 
    End If 
Loop 
+0

Esto parece funcionar bastante bien, ¡gracias! :) Pero, ¿y si quiero usar las dos primeras líneas para cualquier otra cosa? Digamos, quiero almacenar las primeras líneas en una cadena, y la segunda línea en otra cadena. Entonces, almacena el resto de las líneas en una matriz? –

+0

If LineNum = 1 Then ... ElseIf LineNum = 2 Then ... ElseIf LineNum> 2 Then ... End If – Tomalak

+1

En lugar de usar la variable LineNum, puede usar la función Seek. Elimine 'LineNum = LineNum + 1' así como la declaración y la inicialización, y reemplace' LineNum> 2' con 'Seek (iFileNum)> 2'. Además, podría usar 'Do Until EOF (iFileNum)' en lugar de 'Do While Not EOF (iFilenum)'. – systemovich

6

Usted puede utilizar el acceso aleatorio.

Open "C:\docs\TESTFILE.txt" For Random As #1 

    Position = 3 ' Define record number. 
    Get #1, Position, ARecord ' Read record. 

Close #1 
1
Dim sFileName As String 
Dim iFileNum As Integer 
Dim sBuf As String 
Dim Fields as String 
Dim TempStr as String 

sFileName = "c:\fields.ini" 
''//Does the file exist? 
If Len(Dir$(sFileName)) = 0 Then 
    MsgBox ("Cannot find fields.ini") 
End If 

iFileNum = FreeFile() 
Open sFileName For Input As iFileNum 

''//This part skips the first two lines 
if not(EOF(iFileNum)) Then Line Input #iFilenum, TempStr 
if not(EOF(iFileNum)) Then Line Input #iFilenum, TempStr 

Do While Not EOF(iFileNum) 
    Line Input #iFileNum, Fields 

    MsgBox (Fields) 
Loop 
Cuestiones relacionadas