Utilización de ejemplos de código M dados como soluciones en Power Query

Un usuario Pregunto ✅

Edhans


Si la respuesta a su pregunta en el foro involucra Power Query, o se puede hacer mejor en Power Query, la solución propuesta puede venir en forma de un bloque de código, conocido como Código M, y puede tener el siguiente aspecto:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSlTSUUoC4mQgNgRipVidaKUUICMViNNAAjpKRkqxsQA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Column1 = _t, Column2 = _t, Column3 = _t, xx1 = _t, xx2 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}, {"Column2", type text}, {"Column3", type text}, {"xx1", Int64.Type}, {"xx2", Int64.Type}}),
    #"Core Columns" = {"Column1", "Column2", "Column3"},
    #"Dynamic Columns" = List.Difference(Table.ColumnNames(#"Changed Type"),#"Core Columns"),
    #"Replaced Value" = Table.ReplaceValue(#"Changed Type",null,0,Replacer.ReplaceValue, #"Dynamic Columns")
in
    #"Replaced Value"

Para ver cómo funciona esto, simplemente pegue ese código en el Editor avanzado de Power Query en una nueva consulta en blanco.

1) En Power Query, seleccione New Source, luego Blank Query
2) En la cinta de Inicio, seleccione el botón «Editor avanzado»
3) Elimina todo lo que ves, luego pega el código M que te he dado en ese cuadro.
4) Presione Listo

Veamos la pregunta original, luego qué hace ese breve fragmento de código, luego cómo usar ese código en su modelo con datos reales, no con datos de muestra.

La pregunta original era ¿cómo se pueden reemplazar todos los valores nulos en columnas nuevas con cero, pero no reemplazar los valores nulos en las primeras tres columnas? Cada mes se agrega una nueva columna a los datos, probablemente un archivo Excel o CSV, por lo que el código tiene que manejar estas nuevas columnas.

Analicemos el código anterior. Las dos primeras líneas son los datos de muestra para tener algo con lo que trabajar. Parece un galimatías, pero eso es lo que usa Power Query cuando usa la función «Ingresar datos». Almacena esos datos en formato binario. Entonces, estas dos primeras filas de código devuelven esta pequeña tabla en Power Query:

2020-06-08 13_23_55-Sin título - Power Query Editor.png

Ahora tenemos algunos datos de muestra. Column1, Column2 y Column3 representan las columnas centrales que nunca deberían tener nulos, en caso de que aparezcan, reemplazados por cero. Pero las columnas xx1 y xx2 deben tener nulos reemplazados con cero, y según la solicitud, las futuras columnas xx3, xx4, xx5, etc. también deben tener los nulos reemplazados.

Los últimos tres pasos, que se denominan columnas principales, columnas dinámicas y valores reemplazados, son los que debe agregar a su consulta original. Permítanme explicar brevemente lo que hace cada paso para proporcionar algo de contexto:

  • Columnas principales: este es un paso que creará una lista para indicar al siguiente paso qué columnas ignorar. En este ejemplo, necesitaría reemplazar Column1, Column2 y Column3 con los nombres de columna que desea dejar solo en sus datos de origen.
  • Columnas dinámicas: este paso devuelve una lista de todos de los nombres de columna en sus datos, luego usando List.Difference (), lo compara con la lista «Core Columns» que fue codificada anteriormente y devuelve una lista final de los únicos nombres de columna que no están en las Core Columns. Entonces, a medida que los datos de origen agreguen nuevas columnas, todas esas nuevas columnas estarán en esta lista de «Columnas dinámicas». Nota: Este es el primer paso en el código de muestra que hace referencia a los datos originales, que es una tabla llamada # «Tipo cambiado», y es lo que modificaremos más adelante.
  • Reemplazar valores: esto simplemente reemplaza nulo con cero para todas las columnas devueltas por la lista Columnas dinámicas.

Supongamos que su consulta original está importando un archivo CSV. Podría tener este aspecto después de la operación inicial «Obtener datos de CSV»:

let
    Source = Csv.Document(File.Contents("C:UsersUser NameOneDriveTest File.csv"),[Delimiter=",", Columns=5, Encoding=65001, QuoteStyle=QuoteStyle.None]),
    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Column1", type text}, {"Column2", type text}, {"Column3", type text}, {"xx1", Int64.Type}, {"xx2", Int64.Type}})
in
    #"Changed Type"

Lo que queremos hacer es tomar los últimos tres pasos de la primera consulta en la parte superior de este artículo e injertarlos en esta consulta. Por ahora, simplemente pegue esos tres últimos pasos en sus datos en el editor de consultas avanzadas. se verá así:

2020-06-08 14_34_13-Editor avanzado.png

Ahora vamos a limpiarlo, porque tal como está, no funcionará.

  1. Elimine las líneas 5 y 6. Estos son los últimos pasos de su consulta original y ya no son necesarios.
  2. Agregue una coma al final de la línea 4, para que termine como … {«xx2», Int64.Type}}), – esto le dice a Power Query que hay más pasos por venir.
  3. Puede ignorar el paso # «Columnas principales». Está bien como está y no debe cambiarse. Se hace referencia más adelante en la consulta, pero en realidad no hace referencia a un paso anterior.
  4. Línea # 8 posiblemente necesita ser cambiado. En este caso particular, no es así, porque el último paso de la consulta real así como el último paso del código de muestra fue # «Paso modificado». Pero si su último paso antes de pegar esta consulta fue # «Columnas sin pivote», por ejemplo (o lo que estaría en su línea número 4 en la imagen de arriba) necesita reemplazar la referencia de la tabla en la línea 8. Entonces, el cambio sería como sigue:
    1. # «Columnas dinámicas» = Diferencia de lista (Table.ColumnNames (# «Tipo cambiado»), # «Columnas principales»),
    2. # «Columnas dinámicas» = List.Difference (Table.ColumnNames (# «Columnas sin pivote»), # «Columnas principales»),

Eso es todo. Puede presionar HECHO en el editor avanzado.

Todo esto supone que los nombres de columna que nos dio para trabajar en sus datos de muestra coinciden. De lo contrario, tiene que editar más, pero esto al menos hará que el código crítico se integre con sus datos de origen.

Para una inmersión aún más profunda sobre cómo incorporar el código M de los foros en su código, vea este video de @ImkeF.

Deja un comentario

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