You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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红色Mnull
2蓝色null棉麻
3nullnullnull

关键逻辑说明

  • Record.FromList:将子列表的键值对映射为单记录,解决多子字典合并问题,避免父记录重复
  • List.Distinct + List.Combine:动态收集所有字段名,适配后续新增的键
  • Table.ExpandRecordColumn:基于动态字段列表扩展列,自动填充null,替代静态索引的局限性

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:57:11