2017-02-07 15 views
0

テーブル内の複数の列を別のテーブルの列にマージしようとしています。プライマリテーブルの各列にはテキストが含まれ、PrimaryAnalysisテーブルにはテキストのインデックスが含まれます。私は、主テーブルのインデックスの列を作成したいのですが、私はこのように各テーブルに一度に一つのことをやってたんだ:電力クエリーのループ計算

#"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"}}), 

は今、私は23列のためにそれを行う必要があります。 DOを実装する方法はありますか?このタスクを実行するためにPower Queryの繰り返しやその他のループはありますか?

ありがとうございます。

+0

クエリのサンプルテーブルと本体を提供できますか?私は最初からそれを発明したくない。 短い答えは - List.Generateを使用する –

答えて

0

電力クエリでループする1つの方法は、再帰関数を使用することです。 下のコードでは、プライマリテーブルに似たテーブルをExcelファイルで読み込んでいます(ステップ# "Changed Type2"は、# "Changed Type2"と似ているはずです)。

次の関数AddIndicesが定義されています。この関数では、インデックスを持つ1つの列が各繰り返しで追加されます。 23回の反復の後、関数は停止し、それ以外の場合は自身を呼び出します。

このような再帰関数の重要なポイントは、Table.Buffer(ステップ「展開済み」を参照)を含める必要があります。そうでなければ、各繰り返しで、コードはすべての以前の繰り返しを再度評価しようとします。 Table.Bufferはこれを防ぎます。

クエリの最後のステップでは、関数が呼び出されます。

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

この解決策は、スタックオーバーフローを引き起こす可能性があります。テールエンド再帰(https://en.wikipedia.org/wiki/Tail_call)を使用するので、List.Generateを使用する方が良い –