Miguel Escobar Publicada octubre 16, 2019

Reemplazo de valores en Power BI / Power Query (código HTML)

Power BIPower Query

Con Power Query dentro de Excel o Power BI, puedes reemplazar los valores mediante el botón «Replace values», pero hay otros enfoques cuando se necesita reemplazar valores múltiples al mismo tiempo, como los siguientes:

La realidad es que hay varias formas de hacerlo, pero a menudo requiere crear otra tabla de traducción para realizar el reemplazo o la traducción necesarios.

Reemplazando valores automáticamente sin tabla de traducción

Esto a menudo se puede optimizar con las funciones que Power Query ya tiene, pero necesitamos averiguar cuál es nuestra cadena de texto o cómo se ve. En esta publicación del blog, abordaré un escenario específico donde obtienes cadenas de texto que se parecen a las de la siguiente tabla

Text
<p>I will
display &euro;</p>
<p>I will
display &#8364;</p>
<p>I will
display &#x20AC;</p>
<p>&#42; These are specific codes used in
HTML &#40;this is just a sample&#44; but things look great with
&quot;Power Query&quot;&#41;</p>

y la tabla de salida debería tener el siguiente aspecto:

fnDecodeHTML
I will display €
I will display €
I will display €
* These are specific codes used in HTML (this is just
a sample, but things look great with «Power Query»)

Lo que podrías haber notado es que se trata de cadenas de texto escritas en código HTML. En lugar de crear una tabla de traducción personalizada para todos los caracteres y símbolos especiales del lenguaje / código HTML, podemos usar una función / función nativa que Power Query tiene para simplemente traducir todo automáticamente. ¡Averigüemos cómo!

Haz clic en el botón a continuación para que puedas descargar las muestras utilizadas en este artículo:

Una función M nativa disponible para decodificar HTML – Web.Page

Power Query tiene múltiples funciones que le permiten conectarse a diferentes estructuras de archivos y decodificar sus contenidos como archivos XML, JSON, Excel e incluso archivos HTML. Para nuestra página específica, necesitamos usar la función que extrae el contenido y decodifica ese archivo HTML. La función que necesitamos se llama Web.Page:

image

Esta función puede usar una cadena de texto de HTML y traducirla en una cadena de texto simple que. ¡Esto es exactamente lo que necesitamos!

Una cosa a tener en cuenta sobre esta función es que su salida es más una jerarquía, por lo que para obtener lo que necesitamos tendremos que navegar a través de esa jerarquía.

Crear una función personalizada basada en la función nativa Web.Page

(¡ahorrando tiempo!)

Para simplificar las cosas y para ahorrarnos algo de tiempo, ya que reutilizaremos esa función varias veces, pudes seguir la navegación jerárquica adecuada y crear una función personalizada a partir de ella. El código para esa función es el siguiente:

(Text as any) => let
         Source = Text,
         Custom1 = Web.Page(Source),
         Data = Custom1{0}[Data],
         Children = Data{0}[Children],
         Children1 = Children{1}[Children],
         Children2 = Children1{0}[Children],
         Text1 = Children2{0}[Text]
     in
         Text1

que puede copiar / pegar en una consulta en blanco a través del Editor avanzado y nombrar esa función fnDecodeHTML.

Luego puedes invocar esa función utilizando el botón Invoke en la pestaña Add Column y el resultado de esa operación te dará esto:

image

Conclusión

Power Query puede manejar MUCHOS escenarios de reemplazo de valores, pero siempre es una mejor idea comprender primero qué valores estás tratando de encontrar, cómo se están creando y si hay alguna fuente de datos actual o funciones de decodificación disponibles en Power Query puede ayudarnos. En este caso específico, Web.Page es una función que entra en juego y nos ayuda al no tener que crear una tabla de traducción personalizada, que hubiera tomado horas o incluso días para investigar y crear correctamente.

Para aprender técnicas más geniales y escenarios más avanzados con el lenguaje M,  Inscríbete en la prueba GRATUITA de la Academia Power Query donde hablo con más detalle sobre este tipo de técnicas.

Power BIPower Query
Subscribe
Notify of
guest
7 Comentario
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
OSIEL

Hola Miguel, es genial, una consulta, puedes hacer esto mismo cuando te conectas directametne a una direccion de pagina Web, en este ejemplo te conectas a una tabla local, tienes algun ejemplo donde te conectes a una pagina Web.
muchas gracias. cuidate mucho siempre disfruto tus articulos. 😉

Cristian Astorga C.

Como podria reducir este codigo a una sola linea:

#»Valor reemplazado2″ = Table.ReplaceValue(#»Valor reemplazado1″,» De «,» de «,Replacer.ReplaceText,{«TIPO DOC.»,»CLIENTE», «DEUDOR»}),
#»Valor reemplazado3″ = Table.ReplaceValue(#»Valor reemplazado2″,» Ii «,» II «,Replacer.ReplaceText,{«TIPO DOC.»,»CLIENTE», «DEUDOR»}),
#»Valor reemplazado4″ = Table.ReplaceValue(#»Valor reemplazado3″,» E «,» e «,Replacer.ReplaceText,{«TIPO DOC.»,»CLIENTE», «DEUDOR»}),
#»Valor reemplazado5″ = Table.ReplaceValue(#»Valor reemplazado4″,» En «,» en «,Replacer.ReplaceText,{«TIPO DOC.»,»CLIENTE», «DEUDOR»})

Miguel

Hola! ¿Se podrían procesar varios párrafos?
Si tuviera por ejemplo: <p> Texto 1 </p> <p> Texto 2 </p>
Y poder extraer Texto1 Texto2

Miguel

Hola! Al final apliqué lo siguiente en mi caso, y me funcionó bien:

try Html.Table([ColumnName] , {{«text»,»:root»}}) otherwise null

Si no lo hacía así, me quedaban errores.
Gracias por el post! Saludos!