IMPORTAR ARCHIVOS TXT DELIMITADOS POR CARACTERES

Hace unos días estuve buscando información en el INE sobre nacimientos ocurridos en España durante los últimos años. No buscaba una información concreta sino datos generales para confeccionar una pequeña visión evolutiva sobre el tema. Sin embargo, me encontré con varios archivos denominados de “microdatos” donde el volumen de información era considerablemente alto y específico. Esta información estaba almacenada en ficheros .txt y, en concreto, tanto de ancho fijo como delimitado por diferentes caracteres.

Y lo cierto es que en la mayor parte de las veces, la información que buscamos y necesitamos viene contenida en un fichero plano (.txt) donde por su estructura y capacidad podemos almacenar grandes volúmenes de información. Dada su importancia y que hoy en día toma, si cabe, mayor notoriedad con el auge del Big Data y otros conceptos, trataré de explicar mediante el uso de VBA la manera de importar un fichero .txt delimitado por diferentes caracteres.

En este post vamos a ver como podemos importar un fichero .txt delimitado por caracteres ,y para este caso en particular, por tabulaciones.

Veamos mediante un ejemplo la estructura de un fichero de este tipo, que he pasado de Excel a “Texto delimitado por tabulaciones” (he utilizado la misma base de datos del post anterior) . Así es como tenemos la información del .txt, una vez que abrimos los datos en el blog de notas:

IMPORTAR TXT DELIMITADO

Ahora vamos a utilizar la siguiente macro para importar toda la información, como siempre os comento el proceso en el código:

Sub Import_TXT_Delimitado()
'Definimos variables a utilizar
Dim Filtro As String
Dim nFichero As Integer
Dim sCadena As Variant
Dim i, j 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
'para extraer la información de cada línea de datos y entre cada espacio tabulado
'usamos la función Split, en la detallamos que los datos están delimitados por 'tabulaciones "vbTab"
'si estuviesen delimitados por espaciones, sería " " y por comas ","
sCadena = Split(datos, vbTab)
'delimitamos el tamaño de la matriz (linea de datos).
fin = UBound(sCadena) + 1
'mediante un bucle for - next vamos incorporando en cada fila de Excel (i) la 'información de cada linea del txt
'y en cada columna (j) la información de cada espacio delimitado.
For j = 1 To fin
With Sheets(1)
.Cells(i, j).Value = sCadena(j - 1)
End With
Next j
Loop
'por último cerramos el proceso.
Close nFichero
End If
End Sub

Como podéis apreciar, al sintaxis sería: abrir el archivo TXT, determinar su longitud mediante un bucle do-while, luego determinar dentro de cada línea de datos, la longitud de esos datos y mediante un bucle for-next trasladar la información a nuestra hoja Excel. Aquí podéis ver un ejemplo de un bucle dentro de otro bucle (que comentaba en el post anterior)

Es imprescindible tener en cuenta qué tipo de delimitaciones tenemos en nuestro txt, dado que si nos equivocamos el proceso fallará. Solo tendréis que modificar esta parte del código donde definimos la cadena de datos para delimitarla, aquí os dejo algunos ejemplos:

sCadena = Split(datos, vbTab)tabulaciones
sCadena = Split(datos," ")espacios
sCadena = Split(datos, ",")comas
sCadena = Split(datos,";")punto y coma

Y con esto ya hemos finalizado nuestro pequeño proceso para importar archivos de texto delimitados por caracteres 🙂

En el próximo post os mostraré el código para importar .txt de ancho fijo, que aunque es muy similar, tiene sus propias características y especificaciones.

Os dejo los dos archivos, el archivo Excel y el archivo de texto.

Descarga el archivo de ejemplo pulsando en: IMPORTAR TXT DELIMITADO POR CARACTERES

Descarga el archivo TXT de ejemplo pulsando en: ARCHIVO TXT DELIMITADO

 

Anuncios

9 pensamientos en “IMPORTAR ARCHIVOS TXT DELIMITADOS POR CARACTERES

  1. Pingback: IMPORTAR ARCHIVOS TXT DE ANCHO FIJO | Excel Signum

  2. Pingback: EXPORTAR ARCHIVOS TXT DELIMITADOS POR CARACTERES DESDE EXCEL | Excel Signum

  3. Buenas tardes Signum espero que este bien, Quiero primero que todo agradecerle por el excelente trabajo, Tengo varias consultas entre ellas las mas importante es el tipo de delimitador para separa el archivo por columnas ya que en el caso mio no tengo la necesitada de separar el archivo por ninguno de los anteriores (sCadena = Split(datos, vbTab)tabulaciones sCadena = Split(datos,” “)espacios sCadena = Split(datos, “,”)comas o sCadena = Split(datos,”;”)punto y coma).

    Tengo que separar el archivo por columnas pero por posiciones me explico, Tengo la siguiente filas en el TXT.

    0200001CC1592911 0100 76001IBARGUEN IBARGUEN OSCAR ARTURO X
    0200002CC2482374 0100 76001LEYES PANIAGUA CARLOS ALBERTO X
    0200003CC2518187 0100 76001RAMIREZ BEDOYA JENER DANIEL X X

    Columnas
    A B C D E F G H I J K L
    02 1 CC 2470612 01 00 76 001 CRUZ CRUZ HERNAN X
    02 2 CC 3671658 01 00 76 001 MEDRANO RANGEL AMAURIS
    02 3 CC 4467034 01 00 76 001 HERNANDEZ MOSQUERA GILDARDO ANTONIO
    02 4 CC 4637694 01 01 76 001 CHARRUPI LEON HUMBERTO
    02 5 CC 4637802 01 01 76 001 SANDOVAL JUAN
    02 6 CC 4638781 01 00 19 780 POTOSI GONZALEZ EVER ADRIAN

    Así sucesivamente necesito definir el ancho de cada cada columna y para así poder indicarles las posiciones y ir trasladando la información masivamente a las columnas de acuerdo ancho establecido.

    En conclusión necesitaría definir el ancho de cada columna,

    Adjunto archivo modelo TXT y archivo en EXCEL donde se muestra el resultado al que debe llegar cuando se realice la convercion a EXCEL, Quedo atento a sus comentarios y agradezco su atención prestada.

    ENLACE

    https://drive.google.com/drive/folders/1uYdYjeJEo-Q1r7SPebQ-WIijYpNeo_3v?usp=sharing

    Le gusta a 1 persona

  4. Buenas noches Segu; Muchas Gracias por responder: ; Si es correcto es muy parecido al tutorial de ancho fijo por que determinan las posiciones de cada campo, Entonces mi pregunta seria donde le tendría que empezar asignar los espacios o el ancho de los campos y que variables le debo quitar a la macro actual para empezar asignar los campos por que en el otro ejemplo se realizaban de la siguiente manera; Campo1 = C_Der(.Cells(i, 1), 20) y asi sucesivamente continuaba con los otros y hay solo se manejaba una variable que la (i) acá se manejan dos (i) Y (j) perdón por la ignorancia, Quedo atento a sus comentarios.

    Le gusta a 1 persona

    • Hola Carlos:

      He visto la información que me envías, sin embargo echo de menos las especificaciones de cada campo, es decir el ancho de cada campo y el tipo de formato que deseas.

      Esta tarea la vas a poder realizar perfectamente con un post que en su día publique para tratar el tema del big data:

      https://excelsignum.com/2017/04/21/trabajar-con-grandes-bases-de-datos-en-excel-parte-1-importar-la-informacion/

      Descarga este archivo y cambia los nombres de campo por lo que tu tienes e indica las especificaciones de cada campo y el tipo de formato deberías indicar el 2 que es texto.

      Lo principal es que consigas las especificaciones, o en caso de no ser posible contar la longitud de los campos e ir indicándola en cada campo.

      Saludos.

      Me gusta

  5. Estimado Segu es muy interesante tu aporte y quisiera preguntarte si es posible realizar lo mismo pero filtrando por fechas para que se copie los datos de una sola linea en función de la búsqueda y que cada dato delimitado vaya a un determinado cuadro de texto en el formulario?
    Gracias por tu respuesta y ayuda.
    Saludos.

    Me gusta

¿Te ha gustado?, Realiza 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 )

Google+ photo

Estás comentando usando tu cuenta de Google+. 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 )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.