Reemplazar múltiples valores de texto basados ​​en una matriz

Un usuario Pregunto ✅

LPenatti

Hola a todos,

Estoy trabajando en PowerQuery en PowerBI y estoy tratando de escribir una función que reemplace múltiples valores al verificar estos valores dentro de una matriz.

Básicamente, mis datos reales se ven como la primera columna Nombre del cliente, esto es lo que proviene del sistema ERP, miles de filas. La segunda columna, Deseada, es lo que espero, pero no quiero crear una nueva columna, sino reemplazar valores en la misma columna.

LPenatti_2-1624050168647.png

Quiero reemplazar cada brf por BRF SA, para evitar SA, SA y S/A, por ejemplo. Lo mismo para jbs y muchos otros clientes.

Además, quiero evitar los espacios dobles y triples donde Trim no funciona, y muchos otros valores que también quiero reemplazar.

Código de ejemplo para pruebas:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcipKUwjWc1TSUXIKcgOx9JRidaKVkiDCeujiYI4+hnIQRyEYQ9grqRhmipdTMJK4UzHUFBRh59DgEH9f1yAFBUOglHNpcUl+bmoRiIcqq2CEIg3kxsYCAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Customer Name" = _t, Desired = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Customer Name", type text}}),


#"Replaced Value" =
//replace multiple strings
let
    Substitutions = [
        #"  " = " ", //double white space
        #"   " = " ", //triple white space
        #"brf" = "BRF S.A.",
        #"jbs" = "JBS S.A."], 

    Substituted = Table.TransformColumns(#"Changed Type", {"Customer Name", each if Text.Contains(_, "brf", Comparer.OrdinalIgnoreCase) then Text.Replace(_, _, "BRF S.A.") else _, type text})
in
    Substituted

in
    #"Replaced Value"

LPenatti_3-1624057744709.png

Quiero indicar la fórmula para mirar la matriz y luego reemplazarla por el valor respectivo.

La publicación que más se acerca a la solución que necesito es esta:

Reemplazar múltiples valores de texto con un único valor de texto

Pero en este caso la solución reemplaza dos valores por uno solo.

¿Alguien podría ayudarme a encontrar una solución para esto?

¡Gracias por adelantado!

Jakintá

En respuesta a LPenatti

Sí lo es.

Tabla.TransformarColumnas(Paso anterior, {{«Nombre del cliente», each if Text.Upper(Text.Select(Text.Trim(Text.AfterDelimiter(_, » «),» «),{«A»..»Z»,»a». .»z»})) = «SA» luego Text.Upper(Text.Trim(Text.BeforeDelimiter(_, » «))) & » SA» else Text.Proper(_)}})

watkinnc

En realidad, si está seguro de que su tabla de reemplazo es ajustada, puede hacer una combinación (desde la GUI y unirse a la izquierda en la columna Nombre del cliente).

–Nate

CNENFRNL

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcipKUwjWc1SK1YlWSoKw9cAcpyA3hWB9RzhbIRiqKAioKCZGLyYvEaLQK6kYocvLqRiuyzFRISlJoTgRzHEODQ7x93UNUlAwROMrGEEESotL8nNTixTAwBgslgwTi8kzUYqNBQA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Customer Name" = _t]),
    #"UPPER SPACE" = Table.AddColumn(Source, "Transform", each List.Transform(List.Select(Text.Split([Customer Name], " "), each _<>""), each Text.Clean(Text.Upper(_)))),
    SA = Table.TransformColumns(#"UPPER SPACE", {"Transform", each let a=List.Last(_), b=if Text.Combine(List.Transform(Text.SplitAny(a, ". /#(lf)"), Text.Upper)) = "SA" then Text.Combine(List.RemoveLastN(_,1) & {"S.A."}, " ") else Text.Combine(_, " ") in b})
in
    SA

Captura de pantalla 2021-06-19 041803.png

LPenatti

En respuesta a CNENFRNL

hola @CNENFRNL,

Gracias por tu ayuda. Funciona pero quería mantener los nombres correctos en la misma columna, no crear uno nuevo. ¿Es posible?

Jakintá

¿Tal vez esto?

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcipKUwjWc1SK1YlWSoKw9cAcpyA3hWB9RwQbwvRKKkao8XIqhqtxDg0O8fd1DVIwROUaKcXGAgA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Customer Name" = _t]),
    #"Added Custom" = Table.AddColumn(Source, "Custom", each if Value.Is(Value.FromText(Text.Trim(Text.AfterDelimiter([Customer Name], " ")," ")), type number) 
then Text.Proper([Customer Name]) 
else Text.Upper(Text.Trim(Text.BeforeDelimiter([Customer Name], " "))) & " S.A.")
in
    #"Added Custom"

o más generales…

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcipKUwjWc1SK1YlWSoKw9cAcpyA3hWB9RwQbwvRKKkao8XIqhqtxDg0O8fd1DVIwROUaKcXGAgA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Customer Name" = _t]),
    #"Added Custom" = Table.AddColumn(Source, "Custom", each if Text.Upper(Text.Select(Text.Trim(Text.AfterDelimiter([Customer Name], " ")," "),{"A".."Z","a".."z"})) = "SA" 
then Text.Upper(Text.Trim(Text.BeforeDelimiter([Customer Name], " "))) & " S.A."
else Text.Proper([Customer Name]))
in
    #"Added Custom"

LPenatti

En respuesta a Jakintá

hola @Jakinta

Gracias por tu ayuda.

Este código funciona bien, pero todavía tengo una pregunta, ¿es posible mantener el resultado en la misma columna en lugar de crear una nueva?

Jakintá

En respuesta a LPenatti

Sí lo es.

Tabla.TransformarColumnas(Paso anterior, {{«Nombre del cliente», each if Text.Upper(Text.Select(Text.Trim(Text.AfterDelimiter(_, » «),» «),{«A»..»Z»,»a». .»z»})) = «SA» luego Text.Upper(Text.Trim(Text.BeforeDelimiter(_, » «))) & » SA» else Text.Proper(_)}})

LPenatti

En respuesta a Jakintá

hola @Jakinta

¡Gracias! Funcionó 😉

mahoneypat

Esto se puede hacer en el editor de consultas, pero puede ser más fácil simplemente agregar una columna de Grupos en el lado DAX después de cargar la tabla. Puede seleccionar múltiples cada grupo de valores y luego asignarles un valor común en la columna Grupo. Es fácil actualizar y agregar nuevos valores más tarde si es necesario con Editar grupo.

Usar la agrupación y el agrupamiento en Power BI Desktop – Power BI | Documentos de Microsoft

Palmadita

LPenatti

En respuesta a mahoneypat

Hola @mahoneypat

Gracias por la idea, pero no puedo agrupar clientes con el mismo nombre en grupos, cada uno tiene una dirección diferente y tendré que mostrar resultados separados para cada uno de ellos en mi tablero.
Solo quiero tener el nombre estandarizado para los clientes que tienen el mismo nombre, pero sin agregar muchos ‘pasos de reemplazo’ en la consulta, me gustaría aprender cómo hacerlo en un solo paso.

mahoneypat

En respuesta a LPenatti

Sigo pensando que agregar una columna de Grupos satisfaría sus necesidades, pero este artículo describe un enfoque para hacerlo en el editor de consultas.

Múltiples reemplazos o traducciones en Power BI y Power Query – The BIccountant

Palmadita

LPenatti

En respuesta a mahoneypat

hola @mahoneypat

Gracias por compartir el hipervínculo.

Entiendo su punto de vista sobre la creación de grupos, pero hay más de 1000 clientes en mi base de datos. Tendría que crear grupos para todos ellos para evitar los «otros», y cada vez que se registre un nuevo cliente, tendré que editar la columna del grupo.

Tal vez no entiendo completamente tu idea, pero la publicación que enviaste también es bastante esclarecedora, te lo agradezco.

Alba

Hola @LPenatti

No estoy seguro de haber entendido correctamente, pero parece que podría usar la tabla anterior para una combinación. ¿Cómo son los datos que quieres transformar?

¿Puedes mostrar un ejemplo claro de los datos de entrada? y el resultado esperado para esos datos?

Comparta en formato tabular de texto para que el contenido de las tablas se pueda copiar para ejecutar algunas pruebas rápidas. E incluya la tabla anterior que indica las conversiones en formato tabular de texto también.

SU18_powerbi_badge

Acepte la solución cuando haya terminado y considere dando un pulgar hacia arriba si las publicaciones son útiles.

Comuníquese conmigo en privado para obtener asistencia con cualquier necesidad de BI a gran escala, tutoría, etc.

LPenatti

En respuesta a Alba

Hola @AlB, gracias por tu respuesta.

La primera pantalla de impresión es una tabla de ejemplo donde la primera columna es el aspecto de mis datos y la segunda columna es el resultado esperado.

Edité mi publicación para una mejor comprensión y también agregué los contenidos de la tabla en forma tabular.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *