PDI: Expresiones Regulares

PDI: Expresiones Regulares

🎯 Una expresión regular o RegEx es una secuencia de caracteres que forma un patrón de búsqueda, que provee una manera muy flexible de encontrar o reconocer cadenas de texto.

No hay texto alternativo para esta imagen

Cómo se aplican las RegEx?

🔍 Veamos un ejemplo de su aplicación. Supongamos que tenemos que seleccionar los archivos csv cuyo nombre cumpla con el siguiente patrón:

  • comience con el texto test,
  • continúe con un número de cuadro dígitos,
  • continúe con el caracter guión bajo,
  • continúe con tres letras,
  • continúe alternativamente con cualquier grupo de caracteres y
  • finalice con .csv

Entre ellos estarían archivos csv con los nombres:

  • test2005_idx123.csv
  • test1111_qwe.csv
  • test4567_qweqwerty12x.csv
  • test8888_tgx1.csv

📌 En este tipo de escenarios, las RegEx nos resultan muy útiles para construir el patrón que los nombres de los archivos deben poseer.

La siguiente RegEx es la que deberíamos emplear en este caso:

  • ^test\d{4}_[a-zA-Z]{3}.*\.csv$

🔍 Veamos cómo está compuesta:

  • ^test (que comience con el texto test)
  • \d{4} (continúe con un número de cuadro dígitos)
  • _ (continúe con el caracter guión bajo)
  • [a-zA-Z]{3} (continúe con tres letras)
  • .* (continúe alternativamente con cualquier grupo de caracteres)
  • \.csv$ (finalice con.csv)

RegEx en PDI

☑️ En PDI, podemos emplear las RegEx en muchos Step, principalmente en aquellos en los que haya que colocar el path de algún recurso o realizar alguna búsqueda en los valores del dataset.

☑️ También podemos utilizarlas dentro de métodos de JavaScript (por ejemplo en el Step Modified Java Script Value) lo cual nos brinda una enorme flexibilidad en las búsquedas.

RegEx en Acción 🚀

📝 A continuación presentaré un simple ejemplo en donde se utilizan RegEx en PDI.

🎯 Crearemos una Transformation que obtenga los nombres de las librerías presentes en PDI y que devuelva un dataset como el siguiente:

No hay texto alternativo para esta imagen

🎯 Lo que haremos será identificar el nombre de la librería, su versión y su extensión. Para ello emplearemos RegEx y JavaScript!

🔵 1) Creamos una nueva Transformation y la guardamos con el nombre Get_Libs_Names.

🔵 2) Añadimos el Step Input | Get File Names.

⚪🔵 2.1) En la pestaña File configuramos:

No hay texto alternativo para esta imagen

📂 La carpeta en donde buscaremos las libs de PDI es:

  • ${user.dir}/lib | Aquí estamos utilizando una Variable de entorno que nos devuelve el path de instalación de PDI

Y de esta carpeta traeremos todos los archivos que terminen con .jar, entonces utilizamos la RegEx:

  • .+\.jar$

Si presionamos el botón Show filename(s)... podremos ver los archivos que traerá.

Realizar una vista previa de este Step y analizar los valores que devuelve.

⚪🔵 2.2) El la pestaña Filters configuramos:

  • Get = Only Files
  • Include rownum in output? = true
  • Rownum fieldname = idFile
  • Add filename to result = false

🔵 3) Añadimos el Step Transform | Select values y enlazamos la salida del Step anterior hacia este:

No hay texto alternativo para esta imagen

🔧 Configuramos este Step:

No hay texto alternativo para esta imagen

🔵 4) Añadimos el Step Transform | Replace in string y enlazamos la salida del Step anterior hacia este:

No hay texto alternativo para esta imagen

🔧 Configuramos este Step:

No hay texto alternativo para esta imagen

Lo que hacemos es quitar (reemplazar por vacío) el .jar del nombre del archivo (short_filename) y guardar el resultado en filename_aux.

🔵 5) Añadimos otro Step Transform | Replace in string y enlazamos la salida del Step anterior hacia este:

No hay texto alternativo para esta imagen

🔧 Configuramos este Step:

No hay texto alternativo para esta imagen
  • In stream field = filename_aux
  • Out stream field = name
  • use RegEx = Y
  • Search = -(\d|build).*

🔍 Hemos identificado que la versión de la lib siempre cumple con uno de estos dos patrones:

  • comienza con un guión medio (-) y luego continúa con un número, por ejemplo: ant-1.7.1barcode4j-2.0commons-vfs-20100924-pentaho.
  • comienza con un guión medio (-) y luego continúa con el texto build, por ejemplo: trilead-ssh2-build213.

Lo que hacemos es quitar (reemplazar por vacío) la versión del nombre del archivo -sin el .jar- (filename_aux) y guardar el resultado en name.

🔵 6) Añadimos el Step Scripting | Modified Java Script Value y enlazamos la salida del Step anterior hacia este:

No hay texto alternativo para esta imagen

🔧 Configuramos este Step:

No hay texto alternativo para esta imagen

Este código buscará en filename_aux, el valor de name seguido de guión medio y lo quitará (reemplazá con vacío); obteniendo de esta manera la version de la lib.

Por ejemplo si tenemos:

  • filename_aux = axis-1.4
  • name = axis

Y quitamos axis- de axis-1.4 obtendremos: 1.4

🔵 7) Añadimos otro Step Transform | Select values y enlazamos la salida del Step anterior hacia este:

No hay texto alternativo para esta imagen

🔧 Configuramos este Step:

No hay texto alternativo para esta imagen

🔵 8) Añadimos el Step Flow | Dummy y enlazamos la salida del Step anterior hacia este:

No hay texto alternativo para esta imagen
Realizar una vista previa de cada Step y analizar cómo va variando el dataset.

🏆✨ Obtendremos finalmente el resultado buscado:

No hay texto alternativo para esta imagen

Qué hicimos?

🎯 Creamos una Transformation en la que:

  • Obtuvimos la lista de las libs utilizada en PDI y sus correspondientes datos.
  • Seleccionamos solo los campos idFile, short_filename y extension.
  • Creamos el campo filename_aux que contiene el nombre de la lib sin el .jar.
  • Creamos el campo name que contiene solo el nombre de la lib, sin la versión.
  • Creamos el campo version que contiene la versión de la lib.
  • Seleccionamos y ordenamos el dataset.

RegEx utilizadas

Veremos en detalle las RegEx que hemos utilizado en este ejemplo.

🔍 .+\.jar$

  • . = indica que puede haber cualquier caracter
  • .+ = indica que puede haber uno o más caracteres
  • \. = la barra invertida indica que el siguiente caracter debe tomarse el valor literal del caracter, es decir que será solo un punto
  • \.jar$ = indica que termina con el texto .jar

🔍 -(\d|build).*

  • - = indica que debe buscar un guión medio
  • (\d|build) = indica que debe buscar un número o el texto build
  • .* = indica que puede haber cero o más caracteres
Imagen de portada: Poster vector created by macrovector - www.freepik.com

Muy útil el articulo, tengo una duda, estoy descomprimiendo un archivo con un nodo Unzip, cuando el ejecuta uno puede ver el nombre del archivo que descomprimió como recupero ese nombre en esa ejecución en una variable, se que hay un nodo que devuelve el nombre de los archivos en un directorio pero es que si hay otros archivos puedo entrar en conflicto. Gracias

Inicia sesión para ver o añadir un comentario.

Más artículos de Dario Bernabeu

Otros usuarios han visto

Ver temas