Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如何根据Power Query中Power BI参数中以逗号分隔的值列表删除行?_F#_Powerbi_Powerquery_M - Fatal编程技术网

F# 如何根据Power Query中Power BI参数中以逗号分隔的值列表删除行?

F# 如何根据Power Query中Power BI参数中以逗号分隔的值列表删除行?,f#,powerbi,powerquery,m,F#,Powerbi,Powerquery,M,我有一个数据列表,在许多其他列中有一个标题列,还有一个Power BI参数,例如,它的值为a、b、c。我要做的是循环遍历参数的值,并删除以这些字符开头的任何行 例如: Title a b c d 应该成为 Title d 这个逗号分隔的列表可以有一个值,也可以有二十个值。我知道我可以使用 parameterList = Text.Split(<parameter-name>,",") 但我不确定如何继续使用它来过滤。对于一个值,我只使用 #"Filtered Rows" = T

我有一个数据列表,在许多其他列中有一个标题列,还有一个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>))
但这只允许一个值

编辑:我可能把我原来的问题写得很糟糕。参数列表中以逗号分隔的值可以是任意数量的字符,例如:a、abcd、foo、bar,我想看看[key]中的值是否以该字符串开头。

尝试使用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,则List.AnyTrue返回true,我们选择不选择该行。

由于您希望从参数中筛选出所有值,因此可以使用以下方法:

= Table.SelectRows(#"Changed Type", each List.Contains(Parameter1,Text.Start([Title],1))=false)
另一种方法是在表中创建一个自定义列,该列的第一个字符为title:

= Table.AddColumn(#"Changed Type", "FirstChar", each Text.Start([Title],1))
然后在筛选步骤中使用此字段:

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

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

这似乎很有效:

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

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

因此,我正在尝试此操作,我的查询从不到2秒变为几分钟,然后由于内存不足异常而失败。虽然我认为这个解决方案在理论上可能有效,但在实践中它似乎非常慢,这个表中只有大约3000行,所以我很惊讶它运行得这么慢,除非我做错了什么。这很奇怪。不确定它是否有用,但在选择行行行中使用它之前,我会尝试将列表保存到内存中:parameterList=list.BufferText.Split,,好的,这实际上是我的错误-我不小心添加了导致无限调用的行。所以,我可能对我最初的问题措词不当。参数列表中以逗号分隔的值可以是任意数量的字符,例如:a、abcd、foo、bar,我想看看[key]中的值是否以该字符串开头。有没有一种方法可以修改这一点以适应这种情况?我很抱歉-我的问题可能措辞有点糟糕。我在底部的编辑中更新了更多信息。我只是在问题的底部添加了一个新的编辑,以增加一点清晰度。我的参数并不总是单个字符,可以是不同长度的。是否有可能使该用例工作?