我想做, 检查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 ""
答案 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.Contains
和Table.Contains
。似乎适合使用其中任何一个。
如果我正确理解您的代码,则将A
列中的每个值与B
列中的所有值进行比较时,您要进行不区分大小写的部分匹配(因为使用{{1 }}和问题代码中的Text.Upper
。
使用标准功能
以下代码显示了如何使用Text.Contains
或List.Contains
的示例。使用您认为最适合自己的一种:
Table.Contains
这给了我
忽略大小写敏感,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
这给了我
我认为与containsElseOrBlank
和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]),
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
,然后检查联接的结果是否为空表,但是您还需要指定应该如何进行相等比较(假设它可以让您指定此)。