Eres un usuario Anonimo. Haz clic aqui para entrar | Registrate

Leer CSV de memoria y analizar

Este código adopta un enfoque diferente para leer un archivo de texto. En lugar de leer un registro cada vez, la macro carga todo el archivo de texto en la memoria en una sola variable de cadena. La macro analiza entonces la cadena en registros individuales. La ventaja de este método es que accede al archivo en disco solamente una vez. El resto de los siguientes procesamientos ocurre en memoria y es muy rápido.

Sub ReadTxtLines()
    Dim sht As Worksheet
    Dim fso As Object
    Dim fil As Object
    Dim txt As Object
    Dim strtxt As String
    Dim tmpLoc As Long
    
    'Trabajar sobre una hoja activa
    Set sht = ActiveSheet
    
    'Eliminar los datos en la hoja
    sht.UsedRange.ClearContents
    
    'El objeto del sistema de archivos que necesitamos para gestionar archivos
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    'El archivo que nos gustaría abrir y leer
    Set fil = fso.GetFile("c:\test.txt")
    
    'Abrir archivo como TextStream
    Set txt = fil.OpenAsTextStream(1)
    
    'Leer el archivo incluido en una variable de cadena de una vez
    strtxt = txt.ReadAll
    
    'Cerrar textstream y liberar el archivo. ya no lo necesitamos más.
    txt.Close
    
    'Buscar la primera ubicación de la nueva línea
    tmpLoc = InStr(1, strtxt, vbCrLf)
    
    'Pasar en bucle hasta que no haya más nuevas líneas
    Do Until tmpLoc = 0
        'Utilizar Columna A y la siguiente celda vacía para escribir la linea del archivo de texto
        sht.Cells(65536, 1).End(xlUp).Offset(1).Value = _
        Left(strtxt, tmpLoc - 1)
        ' Eliminar la línea analizada de la variable que incluimos en el archivo almacenado
        strtxt = Right(strtxt, Len(strtxt) - tmpLoc - 1)
        'Encontrar la siguiente ubicación de la nueva línea
        tmpLoc = InStr(1, strtxt, vbCrLf)
    Loop
    'La última línea que tiene datos pero no nueva línea de caracteres
    sht.Cells(65536, 1).End(xlUp).Offset(1).Value = strtxt
    Set fso = Nothing
End Sub