Formatos y fuentes de datos 4 min de lectura

Parseo de TXT: lectura línea a línea, expresiones regulares y ejemplos en varios lenguajes

Análisis de archivos de texto: lectura línea a línea de grandes volúmenes, codificaciones, expresiones regulares y ejemplos en varios lenguajes de programación.

EW
Equipo Web-Scraping.es
Recopilación de datos para las necesidades del negocio
Publicado: 15 abril 2025

El archivo de texto (.txt) es el formato más «libre» que existe: no tiene esquema, ni gramática, ni estándar. Lo que hay dentro lo decide por completo quien creó el archivo. Puede ser una lista simple, una exportación de datos con columnas de ancho fijo, una descarga con un separador no estándar o, directamente, texto corrido. Por eso el parseo de TXT no consiste en encontrar una biblioteca para el formato, sino en saber desmontar a mano una estructura arbitraria. El artículo forma parte de nuestro panorama del parseo de documentos.

Primero determine qué hay dentro

Antes de escribir código hay que entender el carácter del archivo. Si son líneas de un mismo tipo (un registro por línea), basta con la lectura línea a línea y el análisis de cada una. Si los valores van separados por un carácter constante — tabulación, punto y coma, barra vertical —, lo que tiene delante es, en esencia, un CSV con separador no estándar, y lo correcto es usar un lector de CSV, que tratará bien las comillas. Y si es texto corrido sin estructura evidente, entran en juego las expresiones regulares, con las que se extraen los fragmentos necesarios según un patrón.

Conviene comprobar aparte la codificación (el texto en español llega a menudo en windows-1252 y no en UTF-8) y el carácter de salto de línea: en los archivos procedentes de Windows es \r\n, en Unix \n. La mayoría de los lenguajes leen las líneas correctamente en ambos casos, pero el \r «de cola» a veces hay que quitarlo a mano.

Lectura línea a línea

Python

Un archivo es un iterador de líneas, así que leerlo línea a línea resulta natural y económico en memoria incluso con archivos de gigabytes.

python
with open("data.txt", encoding="utf-8") as f:
    for line in f:
        line = line.strip()          # quitamos espacios y el salto de línea
        if not line:                 # omitimos las líneas vacías
            continue
        print(line)

JavaScript / Node.js

Para no cargar entero un archivo grande, en Node se lee en flujo, línea a línea, con el módulo readline.

javascript
const fs = require("fs");
const readline = require("readline");

const rl = readline.createInterface({
  input: fs.createReadStream("data.txt", "utf-8"),
});

rl.on("line", (line) => {
  const clean = line.trim();
  if (clean) console.log(clean);
});

Go

go
package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    f, _ := os.Open("data.txt")
    defer f.Close()

    sc := bufio.NewScanner(f)
    for sc.Scan() {
        line := strings.TrimSpace(sc.Text())
        if line != "" {
            fmt.Println(line)
        }
    }
}

Extracción de datos con expresiones regulares

Cuando los valores están «incrustados» en el texto, se sacan con un patrón. Supongamos que el archivo contiene líneas del tipo [2026-06-01] Pedido #1042: 3490 EUR y hay que extraer la fecha, el número de pedido y el importe.

python
import re

pattern = re.compile(r"\[(\d{4}-\d{2}-\d{2})\] Pedido #(\d+): (\d+) EUR")

with open("orders.txt", encoding="utf-8") as f:
    for line in f:
        m = pattern.search(line)
        if m:
            date, order_id, amount = m.groups()
            print(date, order_id, amount)

El mismo enfoque en JavaScript:

javascript
const re = /\[(\d{4}-\d{2}-\d{2})\] Pedido #(\d+): (\d+) EUR/;
const m = line.match(re);
if (m) {
  const [, date, orderId, amount] = m;
  console.log(date, orderId, amount);
}

Las expresiones regulares son la herramienta principal para desmontar texto sin estructura, y conviene tener a mano algún probador interactivo (por ejemplo, regex101) para depurar el patrón sobre líneas reales. Eso sí, hay que recordar sus límites: con regex no se analizan formatos anidados como XML o HTML — ahí hacen falta parsers completos. Para el texto plano organizado por líneas, en cambio, son la elección ideal.

Datos con columnas de ancho fijo

Los sistemas antiguos y las descargas de mainframes entregan a menudo texto en el que las columnas no las define un separador, sino la posición de los caracteres: los 10 primeros caracteres son la referencia, los 30 siguientes el nombre, y así sucesivamente. Ese formato se desmonta con cortes de la línea por índices fijos.

python
with open("fixed.txt", encoding="utf-8") as f:
    for line in f:
        sku   = line[0:10].strip()
        name  = line[10:40].strip()
        price = line[40:50].strip()
        print(sku, name, price)

Un caso particular pero importantísimo: los logs

El tipo de archivo TXT que más toca desmontar en la práctica son los registros de servidores y aplicaciones. Aunque los logs no tienen un estándar común, dentro de una misma fuente el formato de la línea es estable, lo que permite aplicarles las mismas técnicas — lectura línea a línea más expresiones regulares —, aunque con matices propios: entradas multilínea, rotación, volúmenes de gigabytes. A ello está dedicado el artículo aparte sobre el parseo de logs.

Si recibe con regularidad descargas de texto con una estructura no estándar o «flotante» y hay que convertirlas en tablas limpias, configuraremos el parseo para su formato y entregaremos el resultado en CSV, Excel o directamente en su base de datos.