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
- Crearemos un fichero de patterns de Grok
- 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
Una vez configurado podemos poner en marcha el proceso y ver que los records se generan correctamente
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