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.
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"
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
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.
|
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.