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

如何在Power Query中展开含Record、List、null类型的列?

在Power Query中展开包含Record、List和null值的列

问题背景

  • 单一类型列(如全为Record)可通过下拉按钮直接展开,但目标列同时包含Record、嵌套Record的List以及null值,无自动展开按钮,需手动编写代码实现
  • 参考社区方案因真实数据结构差异无法适配,自行编写的代码运行报错,需完成最后一列的完全展开

原报错代码

...
    // Convert the API Response data to a table (of lists)
    #"Converted to Table" = Table.FromList(GeneratedList, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    
    // Expand to get 1 column of Record types
    #"Expanded Column1" = Table.ExpandListColumn(#"Converted to Table", "Column1"),
    
    // Expand those records into their own columns, we need to target Column1.target
    #"Expanded Column2" = Table.ExpandRecordColumn(#"Expanded Column1", "Column1", {"_links", "id", "type", "emitted_at", "conversation", "source", "target"}, {"Column1._links", "Column1.id", "Column1.type", "Column1.emitted_at", "Column1.conversation", "Column1.source", "Column1.target"}),
    
    // At this point, Column1.target is a column of null and Record value types. Expand it again
    #"Expanded Column1.target" = Table.ExpandRecordColumn(#"Expanded Column2", "Column1.target", {"data"}, {"Column1.target.data"}),
    
    // Now we need to target Column1.target.data, which is the column that has Record, List, AND null types
    #"Added NEWEXPANDEDCOLUMN" = Table.AddColumn(#"Expanded Column1.target", #"Expanded Column1.target.data.NEW", each if Value.Type([#"Expanded Column1.target.data"]) = List.Type then [#"Expanded Column1.target.data"] else {[#"Expanded Column1.target.data"]})
in
    #"Added NEWEXPANDEDCOLUMN"

错误分析

  1. 列名语法错误:新列名#"Expanded Column1.target.data.NEW"未用正确的标识符格式包裹
  2. null值未处理:Value.Type(null)会触发错误,且转换逻辑未覆盖null场景
  3. List处理逻辑错误:原代码将已有List再次嵌套一层List,导致后续展开层级混乱

修正后的代码

...
    // Convert the API Response data to a table (of lists)
    #"Converted to Table" = Table.FromList(GeneratedList, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    
    // Expand to get 1 column of Record types
    #"Expanded Column1" = Table.ExpandListColumn(#"Converted to Table", "Column1"),
    
    // Expand those records into their own columns, we need to target Column1.target
    #"Expanded Column2" = Table.ExpandRecordColumn(#"Expanded Column1", "Column1", {"_links", "id", "type", "emitted_at", "conversation", "source", "target"}, {"Column1._links", "Column1.id", "Column1.type", "Column1.emitted_at", "Column1.conversation", "Column1.source", "Column1.target"}),
    
    // At this point, Column1.target is a column of null and Record value types. Expand it again
    #"Expanded Column1.target" = Table.ExpandRecordColumn(#"Expanded Column2", "Column1.target", {"data"}, {"Column1.target.data"}),
    
    // 统一转换为List:null转空List,Record转单元素List,List保持原样
    #"Converted to List" = Table.AddColumn(#"Expanded Column1.target", "TargetDataList", each 
        if [Column1.target.data] = null then {}
        else if Value.Is([Column1.target.data], List.Type) then [Column1.target.data]
        else {[Column1.target.data]}),
    
    // 展开List列
    #"Expanded TargetDataList" = Table.ExpandListColumn(#"Converted to List", "TargetDataList"),
    
    // 展开最终的Record列(替换为实际需要提取的字段名)
    #"Expanded Final Records" = Table.ExpandRecordColumn(#"Expanded TargetDataList", "TargetDataList", {"field1", "field2", "field3"}, {"TargetData.field1", "TargetData.field2", "TargetData.field3"}),
    
    // 可选:删除中间辅助列
    #"Removed Auxiliary Columns" = Table.RemoveColumns(#"Expanded Final Records", {"Column1.target.data", "TargetDataList"})
in
    #"Removed Auxiliary Columns"

关键说明

  • 统一类型转换:通过判断值类型,将三种数据格式统一转为List,确保后续展开操作可批量执行
  • 分步展开:先展开List列,再展开嵌套的Record列,避免层级混乱
  • 字段自定义:将代码中的{"field1", "field2", "field3"}及对应输出列名,替换为你实际需要提取的Record字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:05:16