【问题标题】:How do i remove rows based on comma-separated list of values in a Power BI parameter in Power Query?如何根据 Power Query 中的 Power BI 参数中的逗号分隔值列表删除行?
【发布时间】:2023-03-06 19:41:01
【问题描述】:

我有一个带有标题列(在许多其他列中)的数据列表,并且我有一个 Power BI 参数,例如,其值为“a、b、c”。我想要做的是遍历参数的值并删除以这些字符开头的所有行。

例如:

Title
a
b
c
d

应该变成

Title
d

这个逗号分隔的列表可以有一个值,也可以有二十个。我知道我可以使用

将参数转换为列表
parameterList = Text.Split(<parameter-name>,",")

但是我不确定如何继续使用它来过滤。对于一个值,我只会使用

#"Filtered Rows" = Table.SelectRows(#"Table", each Text.StartsWith([key], <value-to-filter-on>))

但这只允许一个值。

编辑:我的原始问题可能措辞不佳。 parameterList 中的逗号分隔值可以是任意数量的字符(例如:a、abcd、foo、bar),我想查看 [key] 中的值是否以该字符串开头。

【问题讨论】:

    标签: f# powerbi powerquery m


    【解决方案1】:

    尝试使用List.Contains检查起始字符是否在参数列表中。

    each List.Contains(parameterList, Text.Start([key], 1)
    

    编辑:既然你已经改变了要求,试试这个:

    Table.SelectRows(
        #"Table",
        (C) => not List.AnyTrue(
                       List.Transform(
                           parameterList,
                           each Text.StartsWith(C[key], _)
                        )
                    )
     )
    

    对于每一行,这会将parameterList 转换为true/false 值列表,方法是检查当前key 是否以列表中的每个文本字符串开头。如果有任何为真,则List.AnyTrue 返回真,我们选择不选择该行。

    【讨论】:

    • 所以我正在尝试这个,我的查询从不到 2 秒变成了几分钟,然后由于内存不足异常而失败。虽然我认为这个解决方案在理论上可行,但实际上它似乎很慢(这个表中只有大约 3000 行,所以我很惊讶它运行得这么慢),除非我做错了什么。跨度>
    • 这很奇怪。不确定它是否有帮助,但我会尝试将列表保存到内存中,然后在选择行行中使用它:parameterList = List.Buffer(Text.Split(&lt;parameter-name&gt;,","))
    • 好吧,这实际上是我的错 - 我不小心添加了一条导致无限调用的行。所以,我可能对我最初的问题措辞不佳。 parameterList 中的逗号分隔值可以是任意数量的字符(例如:a、abcd、foo、bar),我想查看 [key] 中的值是否以该字符串开头。有没有办法修改它以适用于这种情况?
    【解决方案2】:

    由于您想过滤掉参数中的所有值,您可以使用类似:

    = Table.SelectRows(#"Changed Type", each List.Contains(Parameter1,Text.Start([Title],1))=false)
    

    另一种方法是在表格中创建一个自定义列,该列具有标题的第一个字符:

    = Table.AddColumn(#"Changed Type", "FirstChar", each Text.Start([Title],1))
    

    然后在过滤步骤中使用该字段:

    = Table.SelectRows(#"Added Custom", each List.Contains(Parameter1,[FirstChar])=false)
    

    我用一个小样本集对此进行了测试,它似乎运行良好。您可以测试两者,看看它是否有助于提高性能。如果您仍然面临性能问题,如果您可以共享 pbix 文件可能会更容易。

    【讨论】:

    • 我刚刚在我的问题底部添加了一个新的编辑,以增加一点清晰度。我的参数并不总是单个字符,并且可以具有不同的长度。是否有可能使这项工作适用于该用例?
    【解决方案3】:

    这似乎工作得很好:

    = List.Select(Source[Title], each Text.Contains(Parameter1,Text.Start(_,1))=false)
    

    Source 替换为您的表名称,将 Parameter1 替换为您的参数名称。

    【讨论】:

    • 我很抱歉 - 我的问题可能措辞有点糟糕。我在底部的编辑中更新了更多信息。
    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多