Como a veces trabajamos con plantillas o actualizando documentos que ya tenemos, imagina que tenemos un párrafo o toda una página de texto y que queremos reemplazar todas las veces que aparecen ciertas palabras por un nuevo conjunto. Si bien podríamos usar CTRL+F y hacer el ajuste una a una, también podemos usar fórmulas, como podría ser SUBSTITUTE().
Con esta fórmula vamos a poder introducir cuatro valores para que sean reemplazados por otros cuatro de nuestra preferencia, ¿pero qué pasaría si tenemos un conjunto más grande para reemplazar? Si este es el caso, podemos usar Power Query para transformar el texto original a uno nuevo que haga los cambios que le indiquemos.
Se trata de la función List.Accumulate() de Power Query, y es la que vamos a analizar hoy.
Introduciendo los datos a buscar y reemplazar
Empezaremos con dos tablas, la primera que se llamará «mitexto» y será en donde tendremos los valores de texto originales; y la segunda, llamada «reemplazos», que tendrá las reglas que se aplicarán para hacer los reemplazos.
En estas imágenes se muestra el formato de cada tabla y sus contenidos.
Transformando con Power Query
Empezaremos cargando nuestras dos tablas a Power Query. Recuerda que para hacerlo debemos seguir estos pasos:
- Seleccionaremos una tabla poniendo el cursor dentro.
- En la ficha Datos, veremos la opción “Desde una Tabla / Rango”
- Repetimos para todas las tablas y estaremos listos.
Si necesitas más introducción a Power Query puedes checar muchos artículos aquí.
Lo que vamos a hacer ahora será transformar la tabla «mitexto» para añadir una columna con el texto reemplazado, pero antes de hacerlo debemos tener en cuenta tres conceptos clave:
- La función List.Accumulate()
- Obtener listas de las columnas de una tabla
- Cómo acceder a objetos de una lista individual
Si ya los conoces, entonces puedes saltar a la siguiente parte, sino entonces continúa leyendo estos apartados.
La función List.Accumulate()
Esta función nos permite desarrollar la misma acción tanto en objetos en una lista como regresar un valor combinado.
Un ejemplo de esto sería si tuvieramos una lista de diez números {1..10}, y queremos calcular el total de dichos números. Podemos usar la función «List.Accumulate()» para sumarlos, asumiendo que la lista original se encuentra en «source» podemos usar List.Acccumulate() para añadir objetos de esta forma:
=List.Accumulate(Source, 0, (state, current) => state+current)
El resultado de este paso será 55, que es la suma de la lista con los primeros diez números. Esto ha ocurrido porque List.Accumulate() es una función acumulativa, toma una lista y un valor de inicio (que en este caso son «source» y 0) y aplica una función en cada objeto de la lista mientras modifica el valor inicial.
Esto significa un par de cosas para nuestra lista que varían de usar una fórmula como List.Sum(), tales como:
- Iniciar con 0 (al cual llamaremos estado inicial)
- Para cada objeto en la lista
- Actualizar el estado a estado + actual (por ejemplo, 0+1 al inicio, luego 1+2, 3+3, 6+4… 45+10)
- Al final de la lista, regresará el valor del estado final, que será 55
«¿Cómo escribir el tercer argumento de List.Accumulate()?»
Este tercer argumento es una función con dos parámetros: estado, actual.
- Estado: este será inicialmente puesto como el segundo parámetro de la función y cambia cada vez que List.Accumulate() se mueve bajo la lista.
- Actual: este será el valor del objeto de lista actual.
Las funciones de Power Query están escritas de este modo:
(parametro1, parametro2…) => definición de función
Por lo cual, si, por ejemplo, (estado, actual) => estado+actual es una función que toma dos parámetros y regresa su suma.
Obtener listas de las columnas de una tabla
Si tenemos una tabla llamada «reemplazos» con las columnas [Find] y [Replace] en Power Query, podemos usar esta síntaxis para extraer una columna de tabla como una lista:
tablename[Column name]
Para nuestra tabla, podemos usarlo de la siguiente forma:
reemplazos[Find]
Cómo acceder a objetos de una lista individual
Si tenemos una lista llamada «source» en Power Query con diez objetos, podemos acceder al quinto objeto de la lista con esta síntaxis:
source{4}
Por lo que si, por ejemplo, queremos obtener el tercer objeto de la columna [Find] en la tabla de reemplazos, vamos a usar:
=reemplazos[Find]{2}
Nota importante: Power Query usa el 0 como base para las listas, por lo que el primer objeto listado será list{0}.
Usando List.Accumulate para buscar y reemplazar en masa
Ahora que estamos familiarizados con los conceptos clave, es hora de hacer algunos reemplazos. Iremos al query «mitexto» e insertaremos una columna personalizada. En esta columna vamos a generar el texto reemplazado.
Luego vamos a escribir esta fórmula:
List.Accumulate( List.Numbers(0, Table.RowCount(reemplazos)), [Text], (state, current) => Text.Replace(state, reemplazos[Find]{current}, reemplazos[Replace]{current}))
Y para elaborar en cómo funciona, esto es lo que hace:
- Creamos una lista de números desde el 0. El tamaño de esta lista será el mismo que el número de filas en la tabla de reemplazos. Para nuestra muestra de datos obtenemos {0,1,2,3}.
- Empezamos con valor de la columna de entrada [Text]
- Primero reemplazamos el valor reemplazos[Find] con reemplazos[Replace] en [Text].
- Repetiremos tres veces el paso tres mientras actualizamos el «state».
- Al final de este proceso acabaremos con [Text] que ha reemplazado exitosamente todas las palabras en la tabla de reemplazos.
Podemos ahora usar el boton «Cerrary cargar» de la ficha Inicio para ver los resultados.
Esta fórmula puede ser algo confusa al inicio, pero una vez la entendamos podremos empezar a explorar el potencial que tiene en otro tipo de usos.
Cualquier duda nos leemos abajo.