有没有办法检查文本字段以查看它是否包含列表中的任何字符串?
要检查的示例字符串:
The raisin is green
The pear is red
The apple is yellow
列出要验证的示例
red
blue
green
结果会是
要么:
green
red
null
或:
TRUE
TRUE
FALSE
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"
这将解决问题,它是 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。在示例中:{“绿色”,“红色”,“空”}
希望这对您有帮助。
each if Text.Remove([Texts], {"葡萄干是绿色的","梨是红色的","苹果是黄色的"})<>[Texts] then ...
这里有一个漂亮的函数
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