Este proyecto sigue Versionado Semántico.
[0.1.0] — 2026-08-06
Primera versión. Solo lectura.
Agregado
AnchoFijo.detectar/2: interroga una muestra —binario o ruta— y devuelve un reporte con los largos de línea y su consistencia, el encoding probable (:ascii,:utf8,:latin1), los terminadores de línea, si la última línea trae terminador, y el análisis de delimitadores frecuentes (;,,, tab,|) que sugieran que el archivo no es de ancho fijo.AnchoFijo.Detector.contrastar/2: compara un reporte con un layout y devuelve los desacuerdos como diagnósticos, sin parsear el archivo.AnchoFijo.parsear/3: modo:estricto(corta en la primera línea con problemas) y modo:tolerante(devuelve las filas buenas y los diagnósticos de las malas por separado).AnchoFijo.stream/3: versión lazy, sobre un binario, una ruta o unFile.Streamconstruido por el llamador.AnchoFijo.Layout: definición del formato como data, con validación de la definición misma. Los campos solapados, los nombres duplicados y un largo total declarado insuficiente son errores; los huecos y el relleno final son advertencias enlayout.advertencias.AnchoFijo.Campo: tipos:texto,:entero,:decimal(con:precisionobligatoria y:separadorimplícito, punto o coma) y:fecha(con:formatoobligatorio,:aaaammddo:ddmmaaaa). Opciones de limpieza:trim,:rellenoy:opcional.AnchoFijo.Diagnostico: struct de error con línea, campo, rango de posiciones, qué se esperaba, qué llegó y una causa probable.mensaje/1lo redacta en una línea de español yreporte/1una lista completa.AnchoFijo.Transcodificacion: latin-1 a UTF-8 declarado en el layout, con diagnóstico del byte exacto cuando falla en vez de excepción. Detecta el rango 0x80–0x9F y señala Windows-1252.unidad: :bytes | :caracteresen el layout, para archivos UTF-8 cuyo emisor contó caracteres en vez de bytes.
Notas de diseño
- Los montos nunca pasan por punto flotante: un
:decimalse devuelve como{unidades, precision}. - Las posiciones son 1-based, como en las especificaciones bancarias.
- Cero dependencias de runtime.
Candidatos a 0.2
Ninguno de estos está implementado. Quedan anotados como lo que sigue:
- Multiregistro (header / detalle / trailer). Un layout por tipo de registro, discriminado por el contenido de un campo —típicamente las primeras una o dos posiciones— y validación cruzada del trailer contra los detalles (cantidad de registros y suma de montos). Es la funcionalidad que más piden las cartolas bancarias reales y la razón principal de que exista una 0.2.
- Escritura y serialización. Generar archivos de ancho fijo desde el mismo layout que los lee. Requiere decidir el comportamiento cuando un valor no cabe en el campo: truncar, fallar o rellenar.
- Relleno faltante tolerado. Archivos donde el emisor recorta los espacios finales y la última línea llega corta. Hoy es un diagnóstico de largo; podría ser una opción de layout que complete la línea y lo registre como advertencia.
- Signo al final del campo. El
123-de los formatos heredados de mainframe. - Más encodings. cp1252 y las variantes de EBCDIC que aparecen en integraciones con sistemas antiguos.