我在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非常陌生)
由于
答案 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的第一个元素有两个返回的匹配。