Open IT Experts for Enterprise

Zylk empresa de desarrollo de ecommerce

Procesando ficheros con columnas de tamaño fijo con NiFi

Gustavo Fernández
Gustavo Fernández
apachenifi

Como procesar de manera óptima los ficheros con columnas de tamaño fijo usando expresiones Grok en NiFi

Supongamos que tenemos un conjunto de ficheros que se han generado con un programa que exporta los datos de las columnas con un tamaño fijo. Por ejemplo un programa que exporta los siguientes cuatro campos

  • FechaAlta (YYYYMMDD) 8 posiciones
  • Estado Civil (0|1|2) 1 posición
  • Edad (0-99) 2 posiciones
  • Genero (0|1|2) 1 posición

Cada registro será de la siguiente forma

  • 202001030561 -> que representa un registro con fechas de alta 2020/01/03, estado civil 0, 56 años y genero 1
  •  2020010309 1 -> que representa un registro con fechas de alta 2020/01/03, estado civil 0, 9 años y genero 1
  •  202001032272 -> que representa un registro con fechas de alta 2020/01/03, estado civil 2, 27 años y genero 2

La cuestión es cómo usar NiFi para procesar estos ficheros. Si buscamos en internet la forma clásica de hacerlo es usando un replaceText (linea a linea) para convertir los ficheros en csv separados por punto y coma (;)

  • 20200103;0;56;1 -> que representa un registro con fechas de alta 2020/01/03, estado civil 0, 56 años y genero 1
  •  20200103;0;9;1 -> que representa un registro con fechas de alta 2020/01/03, estado civil 0, 9 años y genero 1
  •  20200103;2;27;2 -> que representa un registro con fechas de alta 2020/01/03, estado civil 2, 27 años y genero 2

Pero existe otra manera de mapear estos ficheros usando expresiones GROK y así poder usar directamente un ConvertRecord sin necesidad de realizar un tratamiento previo del fichero de texto. Para ello haremos lo siguiente

  1. Crearemos un fichero de patterns de Grok
  2. Usaremos dicho fichero para crear un GrokReader capaz de mapera los campos directamente

Para el caso que nos ocupa el fichero de pattern será

FECHA_ALTA .{8}
ESTADO_CIVIL .{1}
EDAD .{2}
GENERO .{1}

FILA %{FECHA_ALTA:fecha_alta}%{ESTADO_CIVIL:estado_civil}%{EDAD:edad}%{GENERO:genero}
Una vez tenemos el fichero de pattern podremos configurar el RecordReader tipo Grok para que haga uso de este pattern y poder procesar el fichero en entrada directamente a un Record

Procesando ficheros con columnas de tamaño fijo con NiFi

Una vez configurado podemos poner en marcha el proceso y ver que los records se generan correctamente

Procesando ficheros con columnas de tamaño fijo con NiFi

Vemos que se añaden dos campos extra, uno (_raw) que contiene el registro antes de su procesado y otro (stackTrace) que contendrá  la información relacionada con los posibles fallos que se puedan producir al procesar cada linea del fichero.

Dejo aquí una template de ejemplo con un flujo de prueba basado en lo explicado en este post

Si te ha parecido interesante comparte este post en RRS

Facebook
LinkedIn
Telegram
Email

Leer más sobre temas relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *