电源查询,检查A列中的值是否包含B列中的值之一

时间:2019-12-27 07:07:25

标签: powerquery

我想做, 检查A列中的值是否包含B列中的值之一,然后该值来自B列,否则为空白。 我写了一个类似于下面的函数,并在添加调用自定义函数时唤醒了这个函数,但是我有不同的表,需要大量的精力来编写和更新它们。 我尝试了很多事情,但没有结果。 如果可以的话,我会很高兴的。谢谢

= (Text)=>
if Text.Contains(Text.Upper(Text),"PRIME B360M-D") then"PRIME B360M-D"else
if Text.Contains(Text.Upper(Text),"PRIME B360M-K") then"PRIME B360M-K"else ""

2 个答案:

答案 0 :(得分:1)

这可能对您有用。创建一个名为Contains的函数,如下所示:

(string as text, list as list) =>
let  Spot = List.PositionOf(List.Transform(list, (substring) => Text.Contains(string, substring)),true,1)
in if Spot<0 then null else list{Spot}

它将查找一个实例,其中字符串包含列表中某项的匹配项,然后从列表中返回该项。如果有多个匹配项,则返回最后一个。没有匹配项返回空值

将自定义列添加到您的表中,如下所示,该表使用函数对照列B项的完整列表检查列A的每个实例

#"Added Custom" = Table.AddColumn(#"PreviousStep", "Custom", each Contains([A],Table.Column(#"PreviousStep","B")))

答案 1 :(得分:0)

M的标准库包括List.ContainsTable.Contains。似乎适合使用其中任何一个。

如果我正确理解您的代码,则将A列中的每个值与B列中的所有值进行比较时,您要进行不区分大小写的部分匹配(因为使用{{1 }}和问题代码中的Text.Upper


使用标准功能

以下代码显示了如何使用Text.ContainsList.Contains的示例。使用您认为最适合自己的一种:

Table.Contains

这给了我

Using standard functions

忽略大小写敏感,let initialTable = Table.FromColumns({{"soft cat", "doG", "fast nun", "long jOg", "big dog", "gullible fish"}, {"time", "slow", "jog", "Dog", "fish", "rambo"}}, type table [A = text, B = text]), oneApproach = Table.AddColumn(initialTable, "usingListContains", each if List.Contains(initialTable[B], [A], (x, y) => Text.Contains(y, x, Comparer.OrdinalIgnoreCase)) then [B] else ""), anotherApproach = Table.AddColumn(oneApproach, "usingTableContains", each if Table.Contains(initialTable, [B = [A]], {"B", (x, y) => Text.Contains(y, x, Comparer.OrdinalIgnoreCase)}) then [B] else "") in anotherApproach doG(在A列中)部分匹配big dog(在B列中),因此匹配输出列(Dog和{{ 1}}不是空白)。 usingListContains(在A列中)和usingTableContains(在B列中)相同。

我假设这是您要实现的匹配行为(在您自己的表中)。


使用自定义功能

如果您发现很难理解这些代码,则可以通过创建自定义函数(请参见下面的gullible fish并可以给它起一个更好的名称)来简单地完成操作:

fish

这给了我

Using custom function

我认为与containsElseOrBlanklet initialTable = Table.FromColumns({{"soft cat", "doG", "fast nun", "long jOg", "big dog", "gullible fish"}, {"time", "slow", "jog", "Dog", "fish", "rambo"}}, type table [A = text, B = text]), containsElseBlank = (someTable as table, columnToCheck as text, columnToLookIn as text, newColumn as text) => let comparer = (x, y) => Text.Contains(y, x, Comparer.OrdinalIgnoreCase), containsFunc = (someValue) => Table.Contains(someTable, Record.FromList({someValue}, {columnToLookIn}), {columnToLookIn, comparer}), newColumn = Table.AddColumn(someTable, newColumn, each if containsFunc(Record.Field(_, columnToCheck)) then Record.Field(_, columnToLookIn) else "") in newColumn, customApproach = containsElseBlank(initialTable, "A", "B", "usingCustomFunction") in customApproach 列(在上图中)相同。但是这种方法只要求您以正确的顺序将参数传递给usingListContains(然后该函数在内部处理其余部分)。


另一种方法可能是使用usingTableContains,然后检查联接的结果是否为空表,但是您还需要指定应该如何进行相等比较(假设它可以让您指定此)。