【问题标题】:Power Query - conditional column with multiple entry criteriaPower Query - 具有多个条目条件的条件列
【发布时间】:2019-10-14 07:16:11
【问题描述】:

我想就我自己无法解决的与电源查询相关的问题寻求您的帮助:

其中一列 [address] 包含如下数据:

    Science Park 404, 1098 XH Amsterdam, Netherlands
    Laan van Malkenschoten 20, 7333 NP Apeldoorn, NL
    plac Europejski 1, 00-844 Warszawa, Poland
    Adrianastraat 6, 3014 XL Rotterdam, Netherlands
    C. Co Brava, 109, 17411 Vidreres, Girona, Spain

我还有一个关键字列表,其中包含:阿姆斯特丹、阿珀尔多伦、鹿特丹

我需要的是 power query 检查 [address] 列是否包含任何关键字,如果是,则在新的自定义列中显示“匹配”:

    Science Park 404, 1098 XH Amsterdam, Netherlands MATCH
    Laan van Malkenschoten 20, 7333 NP Apeldoorn, NL MATCH
    plac Europejski 1, 00-844 Warszawa, Poland
    Adrianastraat 6, 3014 XL Rotterdam, Netherlands  MATCH
    C. Co Brava, 109, 17411 Vidreres, Girona, Spain

关键字列表存储在同一个 Excel 文件中的一个名为“CITIES_NL”的单列表中

理论上,我可以创建一个条件列并对关键字进行硬编码,但我不能这样做,原因有两个:

  • 列表需要是动态的,很可能每天都会添加新的关键字
  • 在生产中,关键字列表将包含 75k 项,无法将其输入到 PQ 中

为了在 Excel 中实现同样的效果,没有 PQ,我会使用这个公式:

    =IF(--SUMPRODUCT(--ISNUMBER(SEARCH(CITIES_NL,address)))>0,"MATCH","")

但是,这必须由 PQ 完成,因为这只是准备我的数据的步骤之一

感谢您的帮助!

迈克尔

【问题讨论】:

    标签: excel powerquery


    【解决方案1】:

    首先,将ADDRESSCITIES_NL 表添加到强大的查询编辑器,将CITIES_NL 转换为列表,然后使用以下命令将自定义列添加到ADDRESS 表公式:

    =if List.Count(Splitter.SplitTextByAnyDelimiter(CITIES_NL)([Column1]))>1 then "MATCH" else null
    

    逻辑是将ADDRESS 拆分为CITIES_NL 列表中包含的任何单词,并计算其中有多少子字符串。如果结果大于1,表示至少找到一个关键字,则使用IF返回MATCH,否则返回(null)

    [Column1] 替换为您的实际列名。

    这里是完整的 Power Query M 代码供您参考:

    let
        Source = Excel.CurrentWorkbook(){[Name="ADDRESS"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),
        #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each if List.Count(Splitter.SplitTextByAnyDelimiter(CITIES_NL)([Column1]))>1 then "MATCH" else "")
    in
        #"Added Custom"
    

    请注意,匹配将区分大小写。如果你想要一个不区分大小写的匹配,你可以在ADDRESS 表中添加一个索引列,复制ADDRESS 查询,将ADDRESSCITIES_NL 都转换为小写然后进行匹配,然后按索引号将匹配的查询与原始的ADDRESS 查询合并。

    如果您有任何问题,请告诉我。干杯:)

    【讨论】:

    • 谢谢特里!这正是我所需要的! BR,迈克尔
    【解决方案2】:

    您可以通过添加一个自定义列来动态执行此操作,该列为每个地址检查每个关键字以查看它是否是子字符串并计算作为地址子字符串的关键字的数量。如果是count > 0,则返回"MATCH"

    这是一种方法:

    = Table.AddColumn(#"Previous Step Reference", "Custom Column Name",
          (C) => if List.Count(
                        List.Select(CITIES_NL[keyword], each Text.Contains(C[address], _))
                    ) > 0
                 then "MATCH"
                 else null,
          type text)
    

    语法有点不同,但逻辑与 Excel 公式非常相似。

    请注意,我定义了一个上下文 C,以便我可以在 CITIES_NL[keyword] 列表的上下文中从该行上下文中引用 address

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-25
      • 2022-07-06
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2023-04-10
      相关资源
      最近更新 更多