Power Automate, WDL y sus conjuros para trocear cadenas de texto
Para familiarizarse con la amplia colección de funciones WDL, hay infinidad de tutoriales en inglése incluso algunos español, como el de nuestro buen amigo Christian Abata. En AnyoneCanAutomate somos muy fans de split(), que como aquel que dice, nos sirve para un roto y un descosido… De entre todos los casos de uso en los que esta función nos hace la vida más fácil, destacaría al menos dos:
- hacer scraping de correos electrónicos para extraer información del ‘asunto’ -subject- o el ‘cuerpo’ -body-,
- transformar una fecha a formato ISO 8601:
Pero incluso la mejor navaja suiza tiene sus limitaciones. Hoy vamos a ver una de ellas y cómo sortearla con la ayuda de chunk(), otra función WDL bastante más desconocida.
El reto
Hace escasos días se recibía una consulta en la comunidad de Power Automate en busca de algún truco eficiente para verificar que una cadena de texto no contuviera caracteres especiales. Cada lenguaje de programación tiene los suyos, pero fuera de ese ámbito, hablar de caracteres especiales suele referirse a todo carácter diferente que no se corresponda con ninguna de las 26 letras mayúsculas-minúsculas del teclado americano, ni con ninguno de los dígitos 0–9.
Conforme a esta última definición, construirse en Power Automate un diccionario de los caracteres especiales puede resultar extremadamente laborioso, pero hacer el esfuerzo inverso resulta muy sencillo:
Nuestra estrategia será la siguiente:
- Paso#1: trocear nuestra cadena de texto -string- en una matriz -array-, cuyos elementos serán cada uno de los caracteres de la primera. Así, para la cadena ‘CAstaña01’, buscamos el siguiente resultado:
[
"C",
"A",
"s",
"t",
"a",
"ñ",
"a",
"0",
"1"
]
- Paso#2: filtrar nuestra matriz -array-, quedándonos con aquellos caracteres que no sean especiales
- Paso#3: transformar la matriz -array- resultante del filtrado en una cadena de texto -string- , uniendo todos sus elementos
- Paso#4: comprobar si nuestra cadena de texto original es idéntica a la obtenida como resultado de los pasos anteriores
Para ayudar a un mejor entendimiento de las expresiones, declararemos una variable de tipo ‘cadena de texto’ -string-, que llamaremos ‘myInputString’ y donde almacenaremos el texto a analizar.
Siendo como somos fans de la función split(), el Paso#1 parece sencillo, ¿verdad?
Para invocar los superpoderes de split() hemos de facilitar dos datos: una cadena de texto -string- a trocear, y una subcadena -substring- de uno o varios caracteres. Con estos mimbres, split() nos ayudará a dividir el primer dato en una matriz -array- con uno o varios elementos utilizando la subcadena como separador.
Tomando como entrada la variable ‘myInputString’, nuestro primer impulso puede llevarnos a tratar de trocear nuestro texto en tantos elementos como caracteres utilizando split() y declarando un subcadena vacía como separador:
split(variables('myInputString'),'')
Pero como nos gusta decir en AnyoneCanAutomate, el diablo está en los detalles. El resultado obtenido es éste…
[
"CAstaña01"
]
chunk() al rescate
Ya decía Borges que la precisión del idioma inglés es una de sus características distintivas. El genial autor argentino aludía a la enorme variedad de verbos y de adjetivos; fruto de entre otros de la doble influencia germánica y latina. En el caso que nos ocupa, podría parecer que chunk() y split() hacen lo mismo, y es que para invocar los superpoderes de chunk() hemos de facilitar dos datos: el primero de ellos una cadena de texto -string- a trocear. Pero entre ambas funciones hay una sutil diferencia.y es el segundo dato a facilitar:
- en el caso de split() era una subcadena de texto -substring- a modo de separador,
- en el caso de chunk() es un número entero -int-
Con estos mimbres, chunk() nos ayudará a dividir el texto a trocear en una matriz -array- con uno o varios elementos de igual número de caracteres, cifra facilitada en el segundo dato.
De modo que para nuestro reto probaremos a utilizar una segunda expresión basada en chunk():
chunk(variables('myInputString'),1)
…y ¡eh voilá!
¡No cantemos victoria antes de tiempo! Nos falta añadir algunos ingredientes adicionales:
Tal y como vemos en el diagrama anterior, la magia combinada de chunk() y del bloque de acción ‘Filtrar matriz’ -Filter Array- nos permitirá examinar caracter a caracter, y descartar los caracteres especiales.
finalmente, los superpoderes de la función WDL join() nos permitirá reconstruir la cadena de texto resultado de eliminar los caracteres especiales, y un bloque de acción ‘Condición’ -Condition- comparar la cadena resultado con la de partida. Si ambas coinciden ¡bingo! nuestro texto no contenía cadenas especiales. Y si diferen, progresaremos por la rama ‘En caso negativo’ -If false- de nuestro bloque Condición
¿Reto superado?
¡Saludos, @PowerNautas!