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:
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
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
Hola Carlos:
No tengo acceso a poder ver los archivos, pero deberías revisar un post que escribí sobre cómo exportar txt de ancho fijo:
https://excelsignum.com/2016/06/13/exportar-archivos-txt-de-ancho-fijo-desde-excel/
Espero que te sirva. Saludos!!
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.
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.
gracias por tu aporte
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.
Hola Christian:
Tendría que ver los datos y lo que quieres hacer, tal cual leo en el comentario no comprendo muy bien que deseas obtener.
Saludos.
Hola es excelente, ahora bien como podría hacer para que comenzara a partir del 3 registro del archivo de texto
Hola José:
Prueba a poner un 2 en lugar de un 0 en la línea de la macro i=0.
Debería comenzar en el 3 registro.
Saludos
Hola Segu buenas tardes, necesito de tu ayuda. Tengo un archivo excel para el cual he programado una macro, pero al ejecutarla sólo me lee 5 de las 25 columnas que componen el archivo. Lee todas las celdas de cada una de esas columnas pero omite el resto de la información. ¿Podrías ayudarme, por favor? … Gracias
Hola Nahyra tendría que ver la macro y los datos y que es lo que hace. Sin esa información no puedo ayudarte. saludos.
Saludos Segu. Excelente la macro, la estoy usando y me funciona perfecto. Pero en mi caso he notado que los caracteres (tildes y ñ) los interpreta como otros signos extraños. He leído que excel debe leer los archivos como UTF-8, ¿pero como se puede hacer para esta macro? Muchas gracias
Hola Mauricio:
Trataré de adaptar una solución para lo que indicas. No obstante en las bases de datos no es recomendable trabajar con tildes. Saludos.
Hola y si tengo la ruta del archivo en una celda, ya que va cambiando, cómo le haría?!!!
Pues en la línea en la que seleccionas el txt, lo indicas la celda en la que se encuentra:
txt = Sheets(«Hoja1»).Range(«B2»)
Saludos.
Lo logre, pero ahora me marca un error en DATOS, dice que se esperaba función o variable… al principio funcionó bien pero ahora marca error…
Hola Segu, no he podido resolver el error den DATOS, me podrías ayudar… ya me frustré… muchas gracias…
Tendría que ver cúal es el problema, de todas formas utiliza PowerQuery, seguramente solucione tu problema. Importa el archivo y modificas ahí los datos.
Saludos
Hola de mucha ayuda este post. mi consulta es si de un txt de 20 columnas separados por «;» solo se quiere cargar 10 columnas dispersas de las 20 que trae el txt. podrias ayudarme
Para traer columnas independientes lo tendrías que hacer con ADO o con Power query, con ADO te dejo un post de ejemplo:
https://excelsignum.com/2017/11/12/usar-excel-para-trabajar-con-big-data/
Y con Power Query importas el archivo lo pasas al modelo de datos y eliges las columnas que te interesan, luego lo dejas como una consulta que puedes ir actualizando la fuente de datos.
Muy buena macro, enhorabuena. ¿Y si quisieramos importar varios TXT a cada hoja del libro y a cada hoja asginarle el nombre del fichero del TXT?
Tendría que reprogramar la macro, si tengo tiempo lo intento, saludos
Hola Segu, felicitaciones. Excelente la informacion… Tendras un ejemplo de como hacer eso mismo en python? Tengo un archivo texto delimitado con caracter especial que quiero pasar a excel.
Pues por ahora no, pero lo apunto para un futuro desarrollo, gracias!!
Buenas tardes, un favor, en Excel por medio de una Macro puedo subir la información de un archivo plano, el cual no tiene ningún delimitador entre campos y los campos son de diferente tamaño?
Ejemplo:
Tipo Char(1)
Compañia Char(3)
NumFact Char(12)
NumCliente Char(6)
NomCliente Char(50)
IDCliente Char(20)
Y tiene otros 25 campos más de diferente tamaño
Muchas gracias
Felipe
Puedes realizar la prueba grabando una macro mientras realizas ese ejercicio. Puedes ver esto también: https://excelsignum.com/2016/02/21/importar-archivos-txt-de-ancho-fijo/