IMPORTAR ARCHIVOS TXT DE ANCHO FIJO

Hace unos días escribí un post sobre cómo importar archivos txt delimitados por caracteres, y quedaba pendiente para otro post (este), importar archivos txt pero de ancho fijo.

Pues bien, siguiendo con el ejemplo anterior, ahora lo que tenemos es una archivo de texto de ancho fijo, previamente definido especificando el ancho de cada campo de texto. Vemos el archivo:

IMPORTAR TXT DE ANCHO FIJOA simple vista ya podemos ver las diferencias con el archivo de la entrada anterior, efectivamente los datos están alineados y con una distancia específica entre cada cadena de texto. Para tratar e importar el archivo a Excel, vamos a usar la misma macro que el ejemplo anterior, pero con algunas modificaciones importantes:

Sub Import_TXT_Anchofijo()
'Definimos variables a utilizar
Dim Filtro As String
Dim nFichero As Integer
Dim sCadena As Variant
Dim i As Double
nFichero = FreeFile
'indicamos que tipo de archivo que vamos a seleccionar (txt)
Filtro = " TXT(*.TXT),"
'buscamos el archivo
txt = Application.GetOpenFilename(Filtro)
'si existe fichero comenzamos la instrucción, de lo contrario el proceso no se 'inicia
If txt <> Empty Then
'mediante un bucle do while recorremos todas las líneas de información del txt
Open txt For Input As nFichero
i = 0
Do While Not EOF(nFichero)
Line Input #nFichero, datos
i = i + 1
sCadena = datos
'definimos la longitud del ancho de cada información e indicamos en que columna se 'debe insertar
'la fila ya viene determinada con la longitud del fichero txt (i) que hemos 'definido al principio
'con la función Mid indicamos los campos a extraer y la con la función Trim 'eliminamos espacios en blanco
'que se nos puedan haber olvidado por error.
With Sheets(1)
.Cells(i, 1) = Trim(Mid(sCadena, 1, 3))
.Cells(i, 2) = Trim(Mid(sCadena, 4, 29))
.Cells(i, 3) = Trim(Mid(sCadena, 33, 20))
.Cells(i, 4) = Trim(Mid(sCadena, 53, 10))
.Cells(i, 5) = Trim(Mid(sCadena, 63, 8))
.Cells(i, 6) = Trim(Mid(sCadena, 71, 16))
.Cells(i, 7) = Trim(Mid(sCadena, 87, 21))
End With
Loop
'por último cerramos el proceso.
Close nFichero
End If
End Sub

Como podéis observar, una vez que seleccionamos el archivo txt, y aislamos la cadena de texto (sCadena) ya podemos extraer cada una de las palabras o caracteres con la función Mid. Por ejemplo, el primer campo tiene 3 espacios de ancho, por ello extraemos desde el punto 1 hasta el tercer carácter: Mid(sCadena, 1, 3)

Para reforzar la función, aplicaremos Trim que es otra función (espacios o recortar) que elimina los espacios en blanco al principio y final del texto, solucionando así si por error introducimos un espacio vacío.

Normalmente cuando tratamos archivos de ancho fijo, tenemos las especificaciones para realizar la importación, en caso de no tenerlas es necesario verificar con suma atención los anchos. En el INE, por ejemplo, todos los archivos que os descarguéis de ancho fijo vienen con un archivo Excel con las especificaciones definidas.

Y ahora ya tenemos toda la información necesaria para importar cualquier tipo de archivo txt, espero que os haya resultado de interés:

Descarga el archivo de ejemplo pulsando en: IMPORTAR TXT DE ANCHO FIJO

Descarga el archivo TXT de ejemplo pulsando en: ARCHIVO TXT ANCHO FIJO

Anuncios

9 pensamientos en “IMPORTAR ARCHIVOS TXT DE ANCHO FIJO

  1. Sera casualidad, pero ya son varios los artículos que publicas que justamente tratan el problema con el que me estoy enfrentando. Lo de importar archivos TXT me ha venido como anillo al dedo, justamente ahora esta planteando como hacerlo y ya me lo has dado resuelto.

    La macro como siempre sencilla, muy bien explicada y muy util.

    Gracias por tu tiempo.

    Adolfo

    Me gusta

    • Muchas gracias Adolfo 🙂 Perfecto que te sirva de ayuda! Últimamente también trato con bastante archivo txt y me parecía una buena idea desarrollar un post sobre el tema.

      Lo dicho, muchas gracias! Saludos

      Me gusta

  2. Buenos días,
    Primero quiero agradecer ya que he aprendido mucho con ustedes y me me han servido muchas de sus macros.
    Hoy quisiera que me ayudaran con un código para abrir un TXT que está delimitado por ancho fijo, y que me de la opción de cambiar la delimitación de los campos ya que en mi trabajo tengo que abrir muchos TXT pero tienen diferente largo, a ver si me hice entender, cuando abra el TXT que me pregunte la delimitación de los campos de alguna forma, se me ocurre seleccionando un rango de celdas que contengan el largo de cada columna.
    Les agradecería muchísimo, gracias.

    Me gusta

    • Hola Fabián, lo que comentas, si lo he entendido bien, de hacer referencia a los largos de campo de una hoja excel, ¿no es lo mismo que modificarlos en el código?, Sería para evitar realizar la modificación en el código y realizar directamente haciendo referencia a una hoja?

      Sería un tema a estudiar. Esta macro está pensada para procesos estandarizados, donde cada x tiempo has de importar los mismos txt. No obstante, me gustaría que explicases un poco más la problemática que tienes.

      Para vincular el ancho de campo a una hoja, solo tienes que hacer referencia a la hoja en la función Mid, por ejemplo, aquí: (Mid(sCadena, 1, 3)) se podría hacer referencia a (Mid(sCadena, sheets(1).cells(1,1), sheets(1).cells(1,2))) donde en la hoja 1 en las celdas a1 y a2 tendrías los valores 1 y 3 respectivamente.

      De esta forma, con una plantilla base podrías ir modificando los anchos de cada campo, simplemente modificándolos en la hoja y no en el código.

      Saludos.

      Me gusta

  3. Hola Segu,

    Gracias por tu pronta respuesta,

    Es exactamente lo que tú dices la maro es para un proceso estándar porque siempre se importar el mismo txt, pero en mi caso tengo un aproximado de 30 archivos txt con diferentes largos y quiera tener un solo proceso para todos donde solo tenga que cambiar el dato, un ejemplo de la fila 1 la cual tendrá en cada columna (celda) el largo que necesito en el momento para el txt que quiero abrir, pues estos largos si están definidos en el layout de cada txt.

    Este es el uso que quisiera implementar.

    Mil gracias.

    Me gusta

    • Hola Fabián,

      Entonces, entiendo que esos 30 TXT forman parte de un proceso (mensual, diario, etc) que has de abrirlos uno por uno y volcar la información en una hoja (u hojas). Suponiendo que el nombre de los TXT no cambie en cada mes (que debería sea así). Una forma sería modificar la macro, eliminando el getopen y la referencia al filtro txt y escribir directamente la ruta, es proceso lo repites por tantos txt tengas que importar, (30 o los que sean)

      Sub Import_TXT_Anchofijo()
      Dim Filtro As String, nFichero As Integer, sCadena As Variant, i As Double
      nFichero = FreeFile
      txt = "C:\Users\tuarchivo.txt"
      If txt Empty Then
      Open txt For Input As nFichero
      i = 0
      Do While Not EOF(nFichero)
      Line Input #nFichero, datos
      i = i + 1
      sCadena = datos
      With Sheets(1)
      .Cells(i, 1) = Trim(Mid(sCadena, 1, 3))
      .Cells(i, 2) = Trim(Mid(sCadena, 4, 29))
      End With
      Loop
      Close nFichero
      End If
      Call (y la macro)
      Call (y la macro)
      Call (y la macro)
      ....
      End Sub

      Una vez que los tengas referenciados a una carpeta o a varias, luego solo tendrás que utilizar una de esas macros y justo antes de End Sub haces un Call a cada macro, de forma que ejecutaras todo el proceso a la vez. Es un proceso sencillo, podrás determinar las especificaciones de cada TXT en su macro y controlar los posibles errores, además podrás vincular cada exportación a una pestaña.

      Espero que así lo puedas lo solucionar. Saludos.

      Me gusta

  4. Hola Segu
    Muchas gracias por esta ayuda.
    Sin embargo, estoy teniendo un problema, ya que el txt que necesito importar no esta separado, es decir, los caracteres vienen todos agrupados por linea de datos, por lo que las lineas de códigos .Cells(i, 1) = Trim(Mid(sCadena no están funcionando.
    Me puedes indicar como corregir esto?
    Desde ya muchas gracias por tu ayuda

    Me gusta

    • Hola Darwin,

      No tendría que ser un problema que los datos del .txt estén todos juntos, de echo es lo habitual (en ancho fijo con ceros o con espacios) y con con caracteres. Por ello, me resulta extraño que no te funcione correctamente.

      Por otra parte, si se trata de un archivo de texto de ancho fijo seguramente en algún lugar tendrás las especificaciones para la importación, de no ser así habría que hacerlas.

      Para responderte más concretamente necesitaría ver el txt y también el resultado esperado de la importación. Esto lo puedes hacer enviando a excelsignum@yahoo.es el txt (un ejemplo de prueba) y en excel el resultado de cómo debería quedar (por ejemplo, la primera linea del txt).

      Saludos.

      Me gusta

  5. Pingback: TRABAJAR CON GRANDES BASES DE DATOS EN EXCEL. PARTE 1: IMPORTAR LA INFORMACIÓN | EXCEL SIGNUM

¿Te ha gustado?. Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s