Power Query中的循环计算

时间:2017-02-07 17:07:58

标签: mysql excel loops transformation powerquery

我正在尝试将表中的多个列合并到另一个表的列中。主表中的每列包含文本,而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中重复或任何其他循环来执行此任务?

提前致谢。

1 个答案:

答案 0 :(得分:0)

在Power Query中循环的一种方法是使用递归函数。 在下面的代码中,我读了一个Excel文件,其表格应该与您的主表类似(因此下面代码中的步骤#“Changed Type2”应该类似于您的步骤#“Changed Type2”)。

接下来定义一个函数AddIndices,其中在每次迭代中添加一个带有索引的列。在23次迭代之后,函数停止,否则它会自行调用。

这种递归函数的一个重要关注点是它必须包含一个Table.Buffer(参见步骤“Expanded”),否则在每次迭代中代码都会尝试再次评估所有以前的迭代并被卡住。 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