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

时间:2017-01-26 15:51:29

标签: powerbi powerquery m

我在Matchlists/tables in power query找到了我要找的部分内容,但我还需要更多内容。

仅使用" Flags"在Matchlists/tables in power query处提供的示例,我正在比较两个列表ListA和ListB,以检查ListB的行内容是否出现在ListA的行内容中。我不能对两行的内容进行一对一的匹配(比如List.Intersect),因为 ListB中行的内容可能只是部分的内容ListA中的一行

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

"仅旗帜"由Matchlists/tables in power query提供的示例已经确定“roo”是ListA行中“在我的房间里”的一部分。我建立在示例上以指定“是”,而不是在ListA之间存在这样的匹配时为true和ListB。

我想要做的是将“是”替换为ListB的实际值 - 例如值“roo”。我试图简单地将wordB替换为“是”,但我得到一个错误,即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非常陌生)

由于

2 个答案:

答案 0 :(得分:4)

我会这样做:

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只留下匹配的值。然后,第一个非null的最新值替换列表A中的字符串(外部List.Tramsform)。

答案 1 :(得分:2)

编辑:我认为您切换了结果的前2个元素?

您可以使用以下代码:

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

&#34; ExtractedValues&#34; step是按下&#34; ListBMatches&#34;标题中的展开按钮的结果。列,然后选择提取值,以逗号分隔。 此选项已在2017年1月更新中添加。

我添加了#34; help&#34;到ListB所以ListA的第一个元素有两个返回的匹配。