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

List.Contains函数异常:Power Query运行卡顿无响应问题求助

解决Power Query中List.Contains筛选性能问题的方案

问题根源

你当前的List.Contains逐行检查逻辑存在两个核心性能瓶颈:

  1. 查找效率低:List.Contains是线性查找(O(n)复杂度),每检查一行就要遍历整个ListOfJustifWBS列表,数据量大时耗时极高。
  2. 重复计算:Power Query的延迟求值特性会导致每次筛选时,ListOfJustifWBS对应的32个Excel文件被重新加载计算,这是进度条重复加载文件的直接原因。

优化步骤

1. 将WBS列表转换为哈希表(Dictionary)

哈希表的查找是常数时间(O(1)),能大幅降低每行的检查耗时。修改你的ListOfJustifWBS查询,最后添加哈希表转换步骤:

let
    // 保留你原有的32个文件提取、筛选列步骤
    Source = ...,
    #"筛选WBS列" = Table.SelectColumns(Source, {"WBS"}),
    #"去重WBS" = List.Distinct(Table.Column(#"筛选WBS列", "WBS")),
    // 转换为哈希表,键为WBS,值设为true即可
    #"创建WBS哈希表" = Dictionary.FromList(List.Transform(#"去重WBS", each {_, true}))
in
    #"创建WBS哈希表"

2. 修改筛选逻辑为哈希表查找

替换原有的Table.SelectRows代码,用哈希表的ContainsKey方法代替List.Contains:

= Table.SelectRows(#"Changed Type", each not Dictionary.ContainsKey(ListOfJustifWBS, [WBS]))

3. 避免重复加载源文件

右键点击ListOfJustifWBS查询,选择仅创建连接。这样Power Query会将该查询的结果缓存到内存,不会在每次筛选时重新加载32个Excel文件。

4. 额外优化建议

  • 从32个Excel文件提取数据时,使用Excel.Workbook(File.Contents(...), null, true)的第三个参数true,只加载数据区域而非格式信息,减少加载量。
  • 对第二个查询的大型Excel文件,先执行Table.Distinct(#"Changed Type", {"WBS"})去重WBS后再筛选,减少需要检查的行数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:24:13