幂查询递归函数:在递归步骤后增加更多步骤
Power query recursive function: add more steps after the recursive step
背景:
我已经发布了一个 regarding a custom function in Power Query that I found in a blog by Chris Webb,我已经得到了答案 to.But 现在我有另一个与同一自定义函数相关的问题。
该自定义函数中令人惊奇的步骤之一是名为“OutputTable”的递归步骤,它使用 if 语句调用自身,基本上 这是一个循环。下面是步骤:
OutputTable = if NextColumnNumber>(Table.ColumnCount(ExpandedTable)-1) then ExpandedTable else ExpandAll(ExpandedTable, NextColumnNumber)
问题:
现在我想在这一步之后做的是能够在 OutputTable 上添加更多转换。
例如,我想在所有行中添加一个只有 "A" 的列。这样做的语法是 AddNewColumn = Table.AddColumn(OutputTable, "Test", each "A")
。但是当我这样做时 给我一个错误 说 "Test" 列已经存在。但我确定没有其他名称为 "Test" 的列。即使我尝试将列名称更改为其他任何名称,我也会收到相同的错误。
注意:虽然我要添加的实际步骤不是 AddColumn,但我想如果我对此有解决方案,我可以弄清楚那部分。
来源代码:
let
Source = (TableToExpand as table, optional ColumnNumber as number) =>
let
ActualColumnNumber = if (ColumnNumber=null) then 0 else ColumnNumber,
ColumnName = Table.ColumnNames(TableToExpand){ActualColumnNumber},
ColumnContents = Table.Column(TableToExpand, ColumnName),
ColumnsToExpand = List.Select(List.Distinct(List.Combine(List.Transform(ColumnContents, each if _ is table then Table.ColumnNames(_) else {}))), each (_ = "view" or _ = "viewfolder" or _ = "Attribute:name")),
NewColumnNames = List.Transform(ColumnsToExpand, each ColumnName & "." & _),
CanExpandCurrentColumn = List.Count(ColumnsToExpand)>0,
ExpandedTable = if CanExpandCurrentColumn then Table.ExpandTableColumn(TableToExpand, ColumnName, ColumnsToExpand, NewColumnNames) else TableToExpand,
NextColumnNumber = if CanExpandCurrentColumn then ActualColumnNumber else ActualColumnNumber+1,
OutputTable = if NextColumnNumber>(Table.ColumnCount(ExpandedTable)-1) then ExpandedTable else ExpandAll(ExpandedTable, NextColumnNumber)
in
OutputTable
in
Source
我猜它是由于函数调用自身并尝试两次应用新列的递归性质而抛出错误,一次在最内层循环中,一次在最外层循环中。
假设我们有一个 table,其中有两列 Col1
和 Col2
需要展开。如果您在 OutputTable
步骤之后添加新列,您将得到:
Start: Col0, Col1, Col2
OutputTable(1): Col0, Col1.a, Col1.b, Col2
OutputTable(2): Col0, Col1.a, Col1.b, Col2.x, Col2.y, Col2.z, Test
AddNewColumn: Col0, Col1.a, Col1.b, Col2.x, Col2.y, Col2.z, Test, Test
可以尝试以下几种方法:
1。仅在递归完成时尝试添加列。
我认为您可以通过如下更改 OutputTable
行来做到这一点:
OutputTable = if NextColumnNumber>(Table.ColumnCount(ExpandedTable)-1)
then Table.AddColumn(ExpandedTable, "Test", each "A")
else ExpandAll(ExpandedTable, NextColumnNumber)
2。在尝试添加之前检查该列是否存在。
AddNewColumn = if Table.HasColumns(OutputTable, "Test")
then OutputTable
else Table.AddColumn(OutputTable, "Test", each "A")
背景:
我已经发布了一个
该自定义函数中令人惊奇的步骤之一是名为“OutputTable”的递归步骤,它使用 if 语句调用自身,基本上 这是一个循环。下面是步骤:
OutputTable = if NextColumnNumber>(Table.ColumnCount(ExpandedTable)-1) then ExpandedTable else ExpandAll(ExpandedTable, NextColumnNumber)
问题:
现在我想在这一步之后做的是能够在 OutputTable 上添加更多转换。
例如,我想在所有行中添加一个只有 "A" 的列。这样做的语法是 AddNewColumn = Table.AddColumn(OutputTable, "Test", each "A")
。但是当我这样做时 给我一个错误 说 "Test" 列已经存在。但我确定没有其他名称为 "Test" 的列。即使我尝试将列名称更改为其他任何名称,我也会收到相同的错误。
注意:虽然我要添加的实际步骤不是 AddColumn,但我想如果我对此有解决方案,我可以弄清楚那部分。
来源代码:
let
Source = (TableToExpand as table, optional ColumnNumber as number) =>
let
ActualColumnNumber = if (ColumnNumber=null) then 0 else ColumnNumber,
ColumnName = Table.ColumnNames(TableToExpand){ActualColumnNumber},
ColumnContents = Table.Column(TableToExpand, ColumnName),
ColumnsToExpand = List.Select(List.Distinct(List.Combine(List.Transform(ColumnContents, each if _ is table then Table.ColumnNames(_) else {}))), each (_ = "view" or _ = "viewfolder" or _ = "Attribute:name")),
NewColumnNames = List.Transform(ColumnsToExpand, each ColumnName & "." & _),
CanExpandCurrentColumn = List.Count(ColumnsToExpand)>0,
ExpandedTable = if CanExpandCurrentColumn then Table.ExpandTableColumn(TableToExpand, ColumnName, ColumnsToExpand, NewColumnNames) else TableToExpand,
NextColumnNumber = if CanExpandCurrentColumn then ActualColumnNumber else ActualColumnNumber+1,
OutputTable = if NextColumnNumber>(Table.ColumnCount(ExpandedTable)-1) then ExpandedTable else ExpandAll(ExpandedTable, NextColumnNumber)
in
OutputTable
in
Source
我猜它是由于函数调用自身并尝试两次应用新列的递归性质而抛出错误,一次在最内层循环中,一次在最外层循环中。
假设我们有一个 table,其中有两列 Col1
和 Col2
需要展开。如果您在 OutputTable
步骤之后添加新列,您将得到:
Start: Col0, Col1, Col2
OutputTable(1): Col0, Col1.a, Col1.b, Col2
OutputTable(2): Col0, Col1.a, Col1.b, Col2.x, Col2.y, Col2.z, Test
AddNewColumn: Col0, Col1.a, Col1.b, Col2.x, Col2.y, Col2.z, Test, Test
可以尝试以下几种方法:
1。仅在递归完成时尝试添加列。
我认为您可以通过如下更改 OutputTable
行来做到这一点:
OutputTable = if NextColumnNumber>(Table.ColumnCount(ExpandedTable)-1)
then Table.AddColumn(ExpandedTable, "Test", each "A")
else ExpandAll(ExpandedTable, NextColumnNumber)
2。在尝试添加之前检查该列是否存在。
AddNewColumn = if Table.HasColumns(OutputTable, "Test")
then OutputTable
else Table.AddColumn(OutputTable, "Test", each "A")