Comment sélectionner certaines colonnes dans Power Query

Oct 29 2020

Je voudrais choisir certaines colonnes dans Power Query, mais sans utiliser leurs noms. Ex. Je peux le faire dans R, par commande: sélectionnez. Je me demande comment je peux le faire dans Power Query. J'ai trouvé des informations ici , mais pas tout ce dont j'ai besoin.

Une idée, si je veux faire référence à plus d'une colonne?

Cela ne fonctionne pas si j'écris le code comme ci-dessous:

#"Filtered Part Desc" = Table.SelectRows ( 
#"Removed Columns3", 
each List.Contains(
    { "ENG", "TRANS" }, 
    Record.Field(_, Table.ColumnNames(#"Removed Columns3") { 5, 6, 7 }) 
)
)

Réponses

2 AlexisOlson Oct 31 2020 at 23:18

Disons que j'ai ce tableau et que je veux y faire plusieurs choses.

Tout d'abord, je souhaite modifier le type de colonne des deuxième et dernière colonnes. Nous pouvons utiliser Table.ColumnNamespour ce faire en utilisant une simple indexation (qui commence à zéro) comme suit:

Table.TransformColumnTypes(
    Source,
    {
        {Table.ColumnNames(Source){1}, Int64.Type},
        {Table.ColumnNames(Source){3}, Int64.Type}
    }
)

Cela fonctionne mais nécessite de spécifier chaque index séparément. Si nous voulons décompresser ces colonnes comme ceci

Table.Unpivot(#"Changed Type", {"Col2", "Col4"}, "Attribute", "Value")

mais en utilisant les valeurs d'index à la place, nous pouvons utiliser la même méthode que ci-dessus

Table.Unpivot(
    #"Changed Type", 
    {
        Table.ColumnNames(Source){1},
        Table.ColumnNames(Source){3}
    }, "Attribute", "Value"
)

Mais y a-t-il un moyen de le faire où nous pouvons utiliser une seule liste de valeurs d'index de position et Table.ColumnNamesne l' utiliser qu'une seule fois? J'ai trouvé une méthode relativement simple mais peu intuitive sur ce blog . Dans ce cas, cela fonctionne comme suit:

Table.Unpivot(
    #"Changed Type",
    List.Transform({1,3}, each Table.ColumnNames(Source){_}),
    "Attribute", "Value"
)

Cette méthode commence par la liste des valeurs d'index de position, puis les transforme en noms de colonnes en recherchant les noms des colonnes correspondant à ces positions.


Voici le code M complet de la requête avec laquelle je jouais:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSlTSUTIE4nIgtlSK1YlWSgKyjIC4AogtwCLJQJYxEFcCsTlYJAXIMgHiKiA2U4qNBQA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Col1 = _t, Col2 = _t, Col3 = _t, Col4 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{Table.ColumnNames(Source){1}, Int64.Type},{Table.ColumnNames(Source){3}, Int64.Type}}),
    #"Unpivoted Columns" = Table.Unpivot(#"Changed Type", List.Transform({1,3}, each Table.ColumnNames(Source){_}), "Attribute", "Value")
in
    #"Unpivoted Columns"