2017-02-07 2 views
0

Je tente de fusionner plusieurs colonnes d'une table avec des colonnes d'une autre table. Chaque colonne de la table primaire contient des textes tandis que la table PrimaryAnalysis contient des index pour les textes. Je voudrais créer des colonnes d'index pour la table primaire mais je vais avoir à faire un à la fois pour chaque table ainsi:Calcul de boucle dans Power Query

#"Merged Queries" = Table.NestedJoin(#"Changed Type2",{"Text.1"},PrimaryAnalysis,{"Letter"},"NewColumn"), 
#"Expanded NewColumn" = Table.ExpandTableColumn(#"Merged Queries", "NewColumn", {"Index"}, {"Index"}), 
#"Renamed Columns2" = Table.RenameColumns(#"Expanded NewColumn",{{"Index", "First"}}), 
#"Merged Queries1" = Table.NestedJoin(#"Renamed Columns2",{"Text.2"},PrimaryAnalysis,{"Letter"},"NewColumn"), 
#"Expanded NewColumn1" = Table.ExpandTableColumn(#"Merged Queries1", "NewColumn", {"Index"}, {"Index"}), 
#"Renamed Columns3" = Table.RenameColumns(#"Expanded NewColumn1",{{"Index", "2nd"}}), 
#"Merged Queries2" = Table.NestedJoin(#"Renamed Columns3",{"Text.3"},PrimaryAnalysis,{"Letter"},"NewColumn"), 
#"Expanded NewColumn2" = Table.ExpandTableColumn(#"Merged Queries2", "NewColumn", {"Index"}, {"Index"}), 
#"Renamed Columns4" = Table.RenameColumns(#"Expanded NewColumn2",{{"Index", "3rd"}}), 

Maintenant, je dois le faire pour 23 colonnes. Existe-t-il un moyen d'implémenter DO ... Repeat ou toute autre boucle dans Power Query pour effectuer cette tâche?

Merci d'avance.

+0

Pourriez-vous fournir quelques exemples de tableaux et le corps de votre requête, pls? Je n'ai aucun désir de l'inventer à partir de zéro. La réponse courte est - use List.Generate –

Répondre

0

Une façon de boucler dans Power Query consiste à utiliser une fonction récursive. Dans le code ci-dessous, je lis un fichier Excel avec une table qui devrait ressembler à votre table primaire (l'étape # "Changed Type2" dans le code ci-dessous devrait ressembler à votre étape # "Changed Type2").

Ensuite, une fonction AddIndices est définie dans laquelle une colonne avec un index est ajoutée à chaque itération. Après 23 itérations, la fonction s'arrête, sinon elle s'appelle elle-même. Un point important d'attention avec de telles fonctions récursives est qu'il DOIT inclure un Table.Buffer (voir l'étape "Expanded"), sinon à chaque itération le code essaye d'évaluer toutes les anciennes itérations et reste bloqué. Table.Buffer empêche cela.

Dans la dernière étape de la requête, la fonction est invoquée.

let 
    Source = Excel.Workbook(File.Contents("C:\Users\Marcel\Documents\Forum bijdragen\StackOverflow Power Query\Loop Computation in Power Query.xlsx"), null, true), 
    Tabel1_Table = Source{[Item="Tabel1",Kind="Table"]}[Data], 
    #"Changed Type2" = Table.TransformColumnTypes(Tabel1_Table,{{"Text.1", type text}, {"Text.2", type text}, {"Text.3", type text}, {"Text.4", type text}, {"Text.5", type text}, {"Text.6", type text}, {"Text.7", type text}, {"Text.8", type text}, {"Text.9", type text}, {"Text.10", type text}, {"Text.11", type text}, {"Text.12", type text}, {"Text.13", type text}, {"Text.14", type text}, {"Text.15", type text}, {"Text.16", type text}, {"Text.17", type text}, {"Text.18", type text}, {"Text.19", type text}, {"Text.20", type text}, {"Text.21", type text}, {"Text.22", type text}, {"Text.23", type text}}), 

// Recursive function: 
    AddIndices = (TableSoFar as table, optional Iteration as number) as table => 
    let 
     CurrentIteration = if Iteration = null then 1 else Iteration, 
     CurrentColumn = "Text."&Text.From(CurrentIteration), 
     NewIndexColumn = "Index."&Text.From(CurrentIteration), 
     MergedTable = Table.NestedJoin(TableSoFar,{CurrentColumn},PrimaryAnalysis,{"Letter"},"NewColumn"), 
     Expanded = Table.Buffer(Table.ExpandTableColumn(MergedTable, "NewColumn", {"Index"}, {NewIndexColumn})), 
     Result = if CurrentIteration = 23 then Expanded else @AddIndices(Expanded, CurrentIteration + 1) 
    in 
     Result, 

// Call recursive function: 
    AddedIndices = AddIndices(#"Changed Type2") 
in 
    AddedIndices 
+0

Cette solution peut provoquer un débordement de pile. Il est préférable d'utiliser List.Generate, car il utilise la récursion de queue (https://en.wikipedia.org/wiki/Tail_call) –