Power Query 检查字符串是否包含列表中的字符串

问题描述 投票:0回答:4

有没有办法检查文本字段以查看它是否包含列表中的任何字符串?

要检查的示例字符串:

The raisin is green
The pear is red
The apple is yellow

列出要验证的示例

red
blue
green

结果会是

要么:

green
red
null

或:

TRUE
TRUE
FALSE
list contains powerquery m
4个回答
6
投票

Daniel 有一个不错的解决方案,但如果示例字符串不是用空格分隔的,它就不起作用。例如,

The brick is reddish
会将
red
检测为子字符串。

您可以使用此公式创建自定义列:

(C) => List.AnyTrue(List.Transform(Words, each Text.Contains(C[Texts], _)))

这将获取列表

Words = {"red","blue","green"}
并检查列表中的每种颜色是否包含在该行的
[Texts]
列中。如果有,则返回
TRUE
,否则返回
FALSE

整个查询如下所示:

let
    TextList = {"The raisin is green","The pear is red","The apple is yellow"},
    Texts = Table.FromList(TextList, Splitter.SplitByNothing(), {"Texts"}, null, ExtraValues.Error),
    Words = {"red","blue","green"},
    #"Added Custom" = Table.AddColumn(Texts, "Check", (C) => List.AnyTrue(List.Transform(Words, each Text.Contains(C[Texts], _))))
in
    #"Added Custom"

0
投票

这将解决问题,它是 PowerQuery(“M”)代码:

let
    Texts = {"The raisin is green","The pear is red","The apple is yellow"},
    Words = {"red","blue","green"},
    TextsLists = List.Transform(Texts, each Text.Split(_," ")),
    Output = List.Transform(TextsLists, each List.Count(List.Intersect({_,Words}))>0)
in
    Output

有两个列表:句子(Texts)和要检查的单词(Words)。要做的第一件事是转换单词列表中的句子,使用“”作为分隔符分割字符串。

TextsLists = List.Transform(Texts, each Text.Split(_," ")),

然后您将新列表与单词列表“交叉”。结果是出现在两个列表(TextList 和 Words)中的元素(字符串)列表。现在您计算这些新列表并检查结果是否大于 cero。

Output = List.Transform(TextsLists, each List.Count(List.Intersect({_,Words}))>0)

输出是一个新列表 {True, True, False)。

或者,您可以通过以下方式更改输出行:

Output = List.Transform(TextsLists, each List.Intersect({_,Words}){0}?)

这将返回第一个巧合的列表,如果没有巧合,则返回 null。在示例中:{“绿色”,“红色”,“空”}

希望这对您有帮助。


0
投票

each if Text.Remove([Texts], {"葡萄干是绿色的","梨是红色的","苹果是黄色的"})<>[Texts] then ...


0
投票

这里有一个漂亮的函数

Text_ContainsAny()
,只要
true
中包含一个(或多个)
substrings
,它就会返回
text
,否则返回
false

let Text_ContainsAny = (
    text as text,
    substrings as list,
    optional comparer as nullable function
) as logical =>
    List.MatchesAny(substrings, each Text.Contains(text, _, comparer))
in
    Text_ContainsAny

如果你想要匹配

substrings
自己,那么这个函数
Text_ContainsSub()
应该可以解决问题:

let Text_ContainsSub = (
    text as text,
    substrings as list,
    optional comparer as nullable function
) as list =>
    List.Select(substrings, each Text.Contains(text, _, comparer))
in
    Text_ContainsSub
© www.soinside.com 2019 - 2024. All rights reserved.