2017-02-07 9 views
0

Я пытаюсь объединить несколько столбцов в таблице в столбцы другой таблицы. Каждый столбец в первичной таблице содержит тексты, в то время как таблица PrimaryAnalysis содержит индексы для текстов. Я хотел бы создать столбцы индексов для первичной таблицы, но мне приходится делать это по одному для каждой таблицы, таким образом:Loop Computation in 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"}}), 

Теперь я должен сделать это за 23 столбцов. Есть ли способ реализовать DO ... Повторить или любой другой цикл в Power Query для выполнения этой задачи?

Заранее спасибо.

+0

Не могли бы вы предоставить несколько примеров таблиц и тела вашего запроса, PLS? У меня нет желания изобретать его с нуля. Короткий ответ - используйте List.Generate –

ответ

0

Один из способов петли в Power Query - использовать рекурсивную функцию. В приведенном ниже коде я прочитал файл Excel с таблицей, которая должна быть похожа на вашу основную таблицу (так что шаг # «Измененный тип2» в приведенном ниже коде должен быть похож на ваш шаг # «Изменен Type2»).

Следующая функция AddIndices определена, в которой на каждой итерации добавляется 1 столбец с индексом. После 23 итераций функция останавливается, иначе она вызывает себя.

Важным направлением внимания к таким рекурсивным функциям является то, что он ДОЛЖЕН включать в себя таблицу.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

Это решение может привести к переполнению стека. Лучше использовать List.Generate, поскольку он использует рекурсию хвоста (https://en.wikipedia.org/wiki/Tail_call) –

 Смежные вопросы

  • Нет связанных вопросов^_^