Power Automate, WDL y sus conjuros para trocear cadenas de texto

Javier Ferreiro
Anyone can Automate
4 min readOct 24, 2023

--

Designed by Dooder / Freepik … y no, cuando hablamos de trocear cadenas de texto no nos referimos a esto

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:

Tirando de split() para que nuestros flujos entiendan fechas en dd/MM/yy

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:

Diccionario de caracteres no especiales: a-z, A-Z, 0–9. ¡Recordad que la Ñ no forma parte del teclado anglosajón!

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.

CAstaña01 tiene un caracter especial: la ñ

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!

--

--