从一个列表中的另一个列表中查找字符串并找到 Return 个字符串

Find String from One List within Another List and Return String Found

我在 找到了我想要的部分内容,但我还需要更多。

使用 中提供的 "Flags only" 示例,我正在比较两个列表 ListA 和 ListB,以检查 ListB 的行内容是否完全出现在 ListA 的行内容中。我不能对两行的内容进行一对一的匹配(比如 List.Intersect),因为 ListB 中一行的内容可能只是 part[= ListA中某行内容的39=].

请注意,在下面的查询中,ListB 包含“roo”,这是单词 room 的前三个字母。我想知道“roo”在 ListA 的“in my room”所在的行中。

提供的"Flags only"示例已经确定“roo”是ListA的“in my room”所在行的一部分。当 ListA 和 ListB 之间存在这样的匹配时,我基于示例分配“是”而不是 true。

我想做的是用 ListB 中的实际值替换“yes”——例如值“roo”。我试图简单地将 wordB 替换为“yes”,但我收到一个错误,指出 wordB 无法识别。

let
    ListA = {"help me rhonda",  "in my room", "good vibrations", "god only knows"},
    ListB = {"roo", "me", "only"},
    contains_word=List.Transform(ListA, (lineA)=>if List.MatchesAny(ListB, (wordB)=>Text.Contains(lineA, wordB)) = true then "yes" else "no")
in
    contains_word

当前查询结果为:

    List
1   yes
2   yes
3   no
4   yes

我希望查询结果为:

    List
1   roo
2   me
3   
4   only

知道怎么做吗?

(p.s。我对 Power Query / M 非常陌生)

谢谢

编辑:我想你调换了结果的前两个元素?

您可以使用以下代码:

let
    ListA = {"help me rhonda",  "in my room", "good vibrations", "god only knows"},
    ListB = {"roo", "help", "me", "only"},
    TableA = Table.FromList(ListA,null,{"ListA"}),
    AddedListBMatches = Table.AddColumn(TableA, "ListBMatches", (x) => List.Select(ListB, each Text.PositionOf(x[ListA], _) >= 0)),
    ExtractedValues = Table.TransformColumns(AddedListBMatches, {"ListBMatches", each Text.Combine(List.Transform(_, Text.From), ","), type text}),
    Result = ExtractedValues[ListBMatches]
in
    Result

"ExtractedValues" 步骤是按下 "ListBMatches" 列的 header 中的展开按钮并选择“提取值”的结果,逗号分隔。 2017 年 1 月更新中添加了此选项。

我将 "help" 添加到 ListB,因此 ListA 的第一个元素有 2 个匹配项都被返回。

我会这样做:

let
    ListA = {"help me rhonda",  "in my room", "good vibrations", "god only knows"},
    ListB = {"roo", "me", "only"},
    contains_word=List.Transform(ListA, (lineA)=>List.Select(List.Transform(ListB, (wordB)=>if Text.Contains(lineA, wordB) = true then wordB else null), (x)=>x <> null){0}?)
in
    contains_word

[已编辑]

想法是使用 List.Transform 两次:内部一个更改列表 B 以仅保留匹配值。然后最新的第一个 non-null 替换列表 A 中的字符串(外部 List.Tramsform)。