从json动态扩展所有列表和记录

时间:2018-01-31 12:17:39

标签: powerquery m

我想在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"],

但现在我想动态地完成所有操作。

2 个答案:

答案 0 :(得分:3)

Chris Webb为Table-type列编写了一个函数来执行此操作:

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

我已经分享了我为Record-type列所做的调整版本:

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

答案 1 :(得分:0)

假设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(_))))

它动态地适应任何列名。