PowerQuery中动态提取父记录中子字典列表的键值对为列
PowerQuery 动态提取父记录中列表型子字典的字段
需求与难点
- 需求:将父记录中List形式的子字典提取为独立列,子字典的键对应列名,值填充到对应单元格;无对应键的列值设为null。
- 难点:子列表长度为0-3条,空值键值对不会被返回;需支持后续新增键自动生成对应列。
实现步骤(M语言)
步骤1:将子列表合并为单记录
给包含子列表的列(示例中为custom_field_values)添加自定义列,把列表内的子字典(结构假设为[name="字段名", value="字段值"])合并成单个记录:
#"添加合并记录列" = Table.AddColumn(源, "合并字段", each Record.FromList( List.Transform([custom_field_values], (x) => x[value]), List.Transform([custom_field_values], (x) => x[name]) ) )
步骤2:提取所有唯一字段名
遍历所有父记录的合并字段,收集所有可能的字段名,确保后续新增键能自动纳入列列表:
#"提取所有字段名" = List.Distinct( List.Combine( List.Transform(#"添加合并记录列"[合并字段], Record.FieldNames) ) )
步骤3:动态扩展合并记录列
用生成的字段名列表扩展合并记录列,自动为无对应键的行填充null:
#"动态扩展字段" = Table.ExpandRecordColumn( #"添加合并记录列", "合并字段", #"提取所有字段名", #"提取所有字段名" )
步骤4:清理冗余列(可选)
若无需保留原始子列表列,可删除:
#"删除冗余列" = Table.RemoveColumns(#"动态扩展字段", {"custom_field_values"})
测试示例
测试用JSON数据
[ { "id": 1, "custom_field_values": [ {"name": "颜色", "value": "红色"}, {"name": "尺寸", "value": "M"} ] }, { "id": 2, "custom_field_values": [ {"name": "颜色", "value": "蓝色"}, {"name": "材质", "value": "棉麻"} ] }, { "id": 3, "custom_field_values": [] } ]
期望输出表格
| id | 颜色 | 尺寸 | 材质 |
|---|---|---|---|
| 1 | 红色 | M | null |
| 2 | 蓝色 | null | 棉麻 |
| 3 | null | null | null |
关键逻辑说明
Record.FromList:将子列表的键值对映射为单记录,解决多子字典合并问题,避免父记录重复List.Distinct + List.Combine:动态收集所有字段名,适配后续新增的键Table.ExpandRecordColumn:基于动态字段列表扩展列,自动填充null,替代静态索引的局限性
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

