文字/字串上的DAX LOOKUPVALUE

时间:2019-07-18 08:54:57

标签: excel string text vlookup dax

我想在DAX中的文本上创建某种LOOKUPVALUE,它将使带有特定关键字的句子匹配。例如,在下面的示例中,第二行和第三行具有匹配项,因为字符串中包含“ Apple”。问题在于文本在字符串中,而不是独立值。

表1

enter image description here

表2

enter image description here

输出

enter image description here

4 个答案:

答案 0 :(得分:1)

编辑,改进的答案::当一个字符串中有多个键时,此新版本也适用。

我认为PowerQuery是执行此类操作的自然之所。

Output表如下所示:

enter image description here

应用步骤的说明:

  1. 来源:对Table1的引用
  2. 添加的列键列表:添加一个自定义列,其中包含[String]值中的Table2 [Key]值列表。这是“自定义”列的逻辑:

enter image description here

对于每一行,该函数都从[String]值中找到的Table2 [Key]列中选择值。然后,它返回仅包含所选值的列表。

  1. 扩展键列表:扩展[Key]列中的列表
  2. 在键值上与Table2联接:在键值上与Table2联接
  3. 扩展表2:扩展[ItemTables]列中的表值,并保留[Item]列
  4. 对键/项进行分组和并置:将“输出”表分组在String上,将键和项进行合并。如果您不想看到[Key]列,请从此步骤中删除{"Key", each Text.Combine([Key], " | "), type text},

“高级编辑器”中的脚本如下所示:

let
    Source = #"Table1",
    #"Added Column Key lists" = Table.AddColumn(Source, "Key", (r) => List.Select(Table.Column(Table2,"Key"),each Text.Contains(r[String],_,Comparer.OrdinalIgnoreCase)),type text),
    #"Expanded Key lists" = Table.ExpandListColumn(#"Added Column Key lists", "Key"),
    #"Join with Table2 on Key" = Table.NestedJoin(#"Expanded Key lists", {"Key"}, Table2, {"Key"}, "ItemTables", JoinKind.LeftOuter),
    #"Expanded ItemTables" = Table.ExpandTableColumn(#"Join with Table2 on Key", "ItemTables", {"Item"}, {"Item"}),
    #"Group and concate keys / items" = Table.Group(#"Expanded ItemTables", {"String"},{{"Key", each Text.Combine([Key], " | "), type text},{"Item", each Text.Combine([Item], " | "), type text}})
in
    #"Group and concate keys / items"

这是我的.pbix文件的link

答案 1 :(得分:0)

我创建了以下虚拟数据集。

enter image description here

enter image description here

我对您的工作的理解是确定句子中是否包含关键字。

这可以通过具有以下公式的计算列来完成-

 Lookup = LOOKUPVALUE(Table2[Result],Table2[LookUp], IF(SEARCH("Apple",Table1[Sentence],,0)> 0, "Apple",""))

您可以将If和Search函数与Lookupvalue函数结合使用。

该公式正在搜索单词“ Apple”,然后返回其在文本中的位置,如果未找到结果,则显示0。

然后,IF语句接受大于0的任何结果,因为大于0的任何结果表示已找到结果,该结果即为它在字符串中的位置,并声明“ Apple”。然后,这成为您的查找值。

然后显示为波纹管

enter image description here

然后可以将当前为if的结果的Blank(“”)替换为另一个if语句,以查找另一个关键字(例如“ Orange”),然后将其添加到查找表中以遍历结果你的之后。

希望这有道理并有帮助!

答案 2 :(得分:0)

我们无需硬编码即可完成此操作:-

1)使用表2中的查询编辑器创建索引列。

2)在表2中像这样创建一个计算列:-

Table2_FruitNameColumn = Key &";" & Item

3)然后使用表1中的此计算列。

FruitFound = 

Var required_Index =
                CALCULATE (
                    MAX(Table2[Index]),
                    FILTER (
                        Table2,
                        SEARCH ( Table1[Table1_Text_Column],  PATHITEM(SUBSTITUTE(Table2[Table2_FruitNameColumn],";","|"),1,TEXT),, 0 ) > 0
                            || SEARCH ( PATHITEM(SUBSTITUTE(Table2[Table2_FruitNameColumn],";","|"),1,TEXT), Table1[Table1_Text_Column],, 0 ) > 0
                    )
                )

var re_index = 
                IF(required_Index = BLANK(),-1,required_Index)

Var required_Table2FruitNameColumn = 
                CALCULATE(FIRSTNONBLANK(Table2[Table2_FruitNameColumn],1),FILTER(Table2, Table2[Index] = re_index))

var my_second_part_concat = 
                PATHITEM(SUBSTITUTE(required_Table2FruitNameColumn,";","|"),2,TEXT)

return my_second_part_concat 

如果您不了解计算所得的列,请尝试在列的返回位置逐步返回输出。

请接受答案(如果有帮助的话),或者让我知道是否有帮助。

答案 3 :(得分:0)

尝试以下公式(请看图片,在我的假设中哪个单元格在其中):

=IFERROR(INDEX($B$7:$B$9,MATCH(1,--NOT(ISERROR(FIND($A$7:$A$9,$A12))),0)),"-")

enter image description here