【问题标题】:Dynamically expand ALL lists and records from json动态扩展 json 中的所有列表和记录
【发布时间】:2021-04-27 22:19:08
【问题描述】:

我想在 json 响应中展开所有列表和记录。 列就像例如(这是动态的,也可以是10条记录和5条列表):

文本、文本、[列表]、[列表]、文本、[记录]、[记录]、字符串、[记录]

我写了一个函数来获取具有特定类型的所有列

Cn.GetAllColumnsWithType = (table as table, typ as type) as list =>
let
    ColumnNames = Table.ColumnNames(table),
    ColumnsOfType = List.Select(ColumnNames, (name) =>
        List.AllTrue(List.Transform(Table.Column(table, name), (cell) => Type.Is(Value.Type(cell), typ))))
in
    ColumnsOfType;

还有一个从表中展开所有列表的函数

Cn.ExpandAllListsFromTable = (table as table, columns as list) =>
let
    expandedListTable = List.Accumulate(columns, table, (state, columnToExpand) =>
        Table.ExpandListColumn(state, columnToExpand))
in
    expandedListTable;

所有列表现在都是记录,我想动态扩展所有这些记录。

我认为我需要一个 foreach 来遍历列表(这只是 Cn.GetAllColumnsWithType 的记录原因), Table.ExpandRecordColumn 每个元素都有它的 Table.ColumnNames 并将其添加到表中,但我不知道该怎么做。 也许你可以帮助我,因为它让我发疯。 干杯

编辑: 我最近打开了一个主题,但我想扩展一个特定的主题,例如

#"SelectItems" = Table.SelectColumns(records,{"$items"}),
#"$items1" = #"SelectItems"{0}[#"$items"],

但现在我想动态地做这一切。

【问题讨论】:

  • 你能提供你想要的样本输入和输出吗?

标签: powerquery m


【解决方案1】:

Chris Webb 为表格类型的列编写了一个函数:

http://blog.crossjoin.co.uk/2014/05/21/expanding-all-columns-in-a-table-in-power-query/

我已经分享了我为记录类型列制作的调整版本:

https://gist.github.com/Mike-Honey/0a252edf66c3c486b69b

【讨论】:

  • 谢谢,这在 power bi 查询编辑器中就像一个魅力。对于测试,我为此添加了一个函数并将其命名为“ExpandAllRecords”。但是我在将该函数添加到 M 中的 Power BI 连接器时遇到了问题。我有点困惑,因为您为此创建了一个 M 文件并且没有命名函数本身。我尝试使用 'Cn.ExpandAllRecords = (TableToExpand as table, optional ColumnNumber as number) => let Source = (TableToExpand as table, optional ColumnNumber as number) = > let ...'
  • 这一切都早于 Power BI 连接器。相反,创建一个新的空白查询,打开高级编辑器并粘贴该代码。将查询命名为 ExpandAllRecords。然后在您的主查询中,您可以在添加自定义列步骤或 M 代码中调用该函数,并传递您的记录类型列。
  • 一般来说,我在 Visual Studio 中使用 M 代码开发 PowerBI 连接器。我不确切知道如何使用您的 github 代码,因为 ExpandAllRecords 被称为递归,我不知道在哪里以及如何正确声明 ExpandAllRecords 函数。我创建了我在上面的评论中写的函数,但是没有用。有点难以解释,但我希望你明白我的意思。
  • 抱歉,我之前没有使用 Power BI 连接器进行编码。
【解决方案2】:

你不需要一个函数。假设M中的上一步命名为Removed Other Columns,而要扩展的列命名为Data,则进行常规的扩展步骤,并将其代码#"Expanded Data"替换为以下代码:

#"Expanded Data"
  = Table.ExpandTableColumn(
    #"Removed Other Columns", 
    "Data", 
    List.Union(List.Transform(#"Removed Other Columns"[Data], each Table.ColumnNames(_)))
  )

它扩展所有列而不引用它们的名称。

【讨论】:

  • 当我尝试这个时,列表列出现错误:Expression.Error: We cannot convert a value of type List to type Table.
  • @iX3 仔细检查您是否按照应有的方式进行了所有操作。 1.在展开列之前添加步骤Remove other columns。 2 您应该有名为 Data 的列,其中包含表。 3 通过单击列标题中指向相反方向的两个箭头的图标,以传统方式展开列数据。 4.将Expanded Data步骤的自动生成代码替换为我的答案中的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多