jueves, 1 de noviembre de 2018

Power Query: Dividir por Separadores

Hoy usaremos algunas funcionalidades de Power Query (Obtener y transformar) en nuestras hoja de cálculo Excel, así como un par de funciones interesantes.

El asunto es que nos han enviado un listado con unos conceptos agregados (aaa, bbb, ccc y ddd ) en un solo campo de nuestra tabla.. siendo nuestro objetivo obtener información individualizada de cada uno de esos conceptos.
Importante:!!: Sabemos que el criterio de reparto es proporcional, a partes iguales...
Esta sería nuestra tabla:

Power Query: Dividir por Separadores



El primer paso es, como siempre, cargar en nuestro Editor de consultas de PQ nuestra tabla.
Desde la ficha de Datos > grupo Obtener y transformar > botón Desde una tabla.

Con la consulta a la vista, desde la ficha Agregar columna > grupo General > botón Columna personalizada configuraremos la siguiente fórmula:
=[Importe]/List.Count(Text.Split([Concepto],"|"))

Power Query: Dividir por Separadores


Fijémonos en las dos funciones de Power Query:
Text.Split - función de texto
devuelve una lista a partir de una cadena, teniendo en cuenta el separador indicado
Text.Split([Concepto],"|")

List.Count - función de lista
devuelve un conteo de elementos en una lista existente
List.Count(listado)

En nuestro caso hemos aprovechado para operar y obtener el reparto del 'Importe' correspondiente.


En el siguiente paso vamos a generar cuatro columnas condicionales nuevas, una por cada elemento existente: aaa, bbb, ccc y ddd.
Podemos hacerlo una a una desde la ficha Agregar columna > grupo General > botón Columna condicional

Power Query: Dividir por Separadores


Prestemos atención a la opción de Salida por 'Columna' y no por 'Valor'.

Repetiríamos esta configuración para los demás elementos... bbb, ccc y ddd


También podríamos trabajarlo con el Editor Avanzado con el código:
let
Source = Excel.CurrentWorkbook(){[Name="Tabla1"]}[Content],
#"Changed Type1" = Table.TransformColumnTypes(Source,{{"Fecha Registro", type date}}),
#"Added Custom" = Table.AddColumn(#"Changed Type1", "Num Eltos.", each [Importe]/List.Count(Text.Split([Concepto],"|"))),
#"Added Conditional Column" = Table.AddColumn(#"Added Custom", "aaa", each if Text.Contains([Concepto], "aaa") then [#"Num Eltos."] else 0),
#"Added Conditional Column1" = Table.AddColumn(#"Added Conditional Column", "bbb", each if Text.Contains([Concepto], "bbb") then [#"Num Eltos."] else 0),
#"Added Conditional Column2" = Table.AddColumn(#"Added Conditional Column1", "ccc", each if Text.Contains([Concepto], "ccc") then [#"Num Eltos."] else 0),
#"Added Conditional Column3" = Table.AddColumn(#"Added Conditional Column2", "ddd", each if Text.Contains([Concepto], "ddd") then [#"Num Eltos."] else 0)

in
#"Added Conditional Column3"


Power Query: Dividir por Separadores



Observa como cada nueva línea es idéntica a la anterior en cuanto a estructura, por lo que se hace muy cómodo copiar y pegar, modificando obviamente los datos correspondientes.

Nuestra consulta, en este momento queda:

Power Query: Dividir por Separadores



LLegados a este punto, con la información dividida por columnas, solo nos quedan un par de pasos simples.
De manera voluntaria quitaremos los campos 'originales' de 'Concepto', 'Importe' y 'Num Eltos.'.
Basta seleccionarlos y con el ratón, botón derecho, y Quitar columnas.


El último paso es igual de sencillo, seleccionaremos las cuatro columnas condicionales creadas (aaa, bbb, ccc y ddd) y desde la ficha Transformar > grupo Cualquier columna > botón Anular dinamización de columnas, quedando nuestra consulta:

Power Query: Dividir por Separadores



Ya podemos devolver a la hoja de cálculo nuestra consulta resultante, así presionamos Cerrar y cargar en... y elegimos destino.
Solo nos falta crear una tabla dinámica sobre la consulta y trabajarla para obtener algo como lo siguiente:

Power Query: Dividir por Separadores



Meta alcanzada.

2 comentarios:

  1. Estimado Ismael, me podrías enviar el archivo de trabajo (lmoscosoz@gmail.com) para realizar el ejemplo paso a paso? Te agradezco de antemano.
    Saludos
    Lucho

    ResponderEliminar
    Respuestas
    1. Hola Luis
      lo siento, pero no guardo los ficheros :'(

      Repite los pasos y cualquier duda comentas

      Sdls

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.