Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel Power Query函数,用于在列表表中搜索匹配的关键字,并返回匹配行前面cel中的文本_Excel_Powerquery_M_Keyword Search - Fatal编程技术网

Excel Power Query函数,用于在列表表中搜索匹配的关键字,并返回匹配行前面cel中的文本

Excel Power Query函数,用于在列表表中搜索匹配的关键字,并返回匹配行前面cel中的文本,excel,powerquery,m,keyword-search,Excel,Powerquery,M,Keyword Search,我有一个类似的问题,但比这个问题更复杂: 还有这个: 我有一个数据库,有很多列,其中一列是自由文本描述字符串。 在工作簿中的另一张Excel工作表上,我设置了一个匹配表,根据关键字列表对行进行分类,如下所示: 类别|关键字 宠物|狗、猫、兔子 汽车|保时捷、宝马、道奇 目标是在我的数据库中放置一个自定义列,该列将根据在“描述”字段中可以找到的列出的关键字返回上述类别(或类别?) 我认为上面的解决方案和来自ImkeF的解决方案还不太成熟,但我没有找到一种方法将其转化为对我的案例的成功查询。(

我有一个类似的问题,但比这个问题更复杂: 还有这个:

我有一个数据库,有很多列,其中一列是自由文本描述字符串。 在工作簿中的另一张Excel工作表上,我设置了一个匹配表,根据关键字列表对行进行分类,如下所示:

  • 类别|关键字
  • 宠物|狗、猫、兔子
  • 汽车|保时捷、宝马、道奇
目标是在我的数据库中放置一个自定义列,该列将根据在“描述”字段中可以找到的列出的关键字返回上述类别(或类别?)


我认为上面的解决方案和来自ImkeF的解决方案还不太成熟,但我没有找到一种方法将其转化为对我的案例的成功查询。(我擅长Excel,但对m和编程查询很在行…

以obove发布的链接为导向:

tbl_类别的M代码:关键字(用逗号分隔)将拆分为行

let
    Source = Excel.CurrentWorkbook(){[Name="tbl_category"]}[Content],
    #"Replaced Value" = Table.ReplaceValue(Source," ","",Replacer.ReplaceText,{"keywords"}),
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Replaced Value", {{"keywords", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "keywords"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"keywords", type text}})
in
    #"Changed Type1"
tbl_文本的M代码。此处将添加一个名为“类别”的自定义列:


面向obove发布的链接:

tbl_类别的M代码:关键字(用逗号分隔)将拆分为行

let
    Source = Excel.CurrentWorkbook(){[Name="tbl_category"]}[Content],
    #"Replaced Value" = Table.ReplaceValue(Source," ","",Replacer.ReplaceText,{"keywords"}),
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Replaced Value", {{"keywords", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "keywords"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"keywords", type text}})
in
    #"Changed Type1"
tbl_文本的M代码。此处将添加一个名为“类别”的自定义列:

好的

基于以上步骤,我终于找到了如何构建符合我需求的查询

注意:为了清晰起见,我使用“行标签”替换了第一个tbl_类别列的列标题

我的解决方案没有我想要的那么简洁(我不得不创建第二个自定义列,因为我不知道如何嵌套这两个步骤,使它们作用于同一个单元格),但它工作得非常完美

再次感谢你的帮助克里斯。。。没有你的线索我就找不到这个迷宫出口

此处修改了第二个代码:

let
    Source = Excel.CurrentWorkbook(){[Name="tbl_text"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Text", type text}}), 
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Category", 
       (Earlier) => Table.SelectRows(tbl_category, 
       each Text.Contains(Record.Field(Earlier, "Text"), Record.Field(_, "keywords"),
       Comparer.OrdinalIgnoreCase))),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "Custom",
       each Text.Combine(Table.ToList(Table.Transpose(
       Table.Distinct(Table.SelectColumns([Category],{"Row Labels"}))),
       Combiner.CombineTextByDelimiter(",")), ", ")),
in
    #"Added Custom1"
格里茨

好的

基于以上步骤,我终于找到了如何构建符合我需求的查询

注意:为了清晰起见,我使用“行标签”替换了第一个tbl_类别列的列标题

我的解决方案没有我想要的那么简洁(我不得不创建第二个自定义列,因为我不知道如何嵌套这两个步骤,使它们作用于同一个单元格),但它工作得非常完美

再次感谢你的帮助克里斯。。。没有你的线索我就找不到这个迷宫出口

此处修改了第二个代码:

let
    Source = Excel.CurrentWorkbook(){[Name="tbl_text"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Text", type text}}), 
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Category", 
       (Earlier) => Table.SelectRows(tbl_category, 
       each Text.Contains(Record.Field(Earlier, "Text"), Record.Field(_, "keywords"),
       Comparer.OrdinalIgnoreCase))),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "Custom",
       each Text.Combine(Table.ToList(Table.Transpose(
       Table.Distinct(Table.SelectColumns([Category],{"Row Labels"}))),
       Combiner.CombineTextByDelimiter(",")), ", ")),
in
    #"Added Custom1"
格里茨只是为了记录在案

一旦应用到实际数据,查询就不再工作了。。。给出错误“我们无法将null值转换为文本类型。” 解决方案就像首先删除“空”单元格(空白单元格是尚未识别关键字的类别)一样简单

tbl_类别的M代码:

let
    Source = Excel.CurrentWorkbook(){[Name="tbl_category"]}[Content],

    #"Filtered Rows" = Table.SelectRows(Source, each ([keywords] <> null)),

    #"Replaced Value" = Table.ReplaceValue(#"Filtered Rows"," ","",Replacer.ReplaceText,{"keywords"}),
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Replaced Value", {{"keywords", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "keywords"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"keywords", type text}})
in
    #"Changed Type1"
let
Source=Excel.CurrentWorkbook(){[Name=“tbl_category”]}[Content],
#“筛选行”=表。选择行(源,每个([关键字]null)),
#“替换值”=表.ReplaceValue(#“筛选行”、“”、“”、replace.ReplaceText、{“关键字”}),
#“按分隔符拆分列”=Table.ExpandListColumn(Table.TransformColumns(#“替换值”、{“关键字”、Splitter.SplitTextByDelimiter(“,”,QuoteStyle.Csv),让itemType=(type nullable text)meta[Serialized.text=true]在{itemType}}}类型中,“关键字”),
#“Changed Type1”=Table.TransformColumnTypes(#“按分隔符拆分列”,{{{“关键字”,键入text}})
在里面
#“已更改类型1”
格里茨只是为了记录在案

一旦应用到实际数据,查询就不再工作了。。。给出错误“我们无法将null值转换为文本类型。” 解决方案就像首先删除“空”单元格(空白单元格是尚未识别关键字的类别)一样简单

tbl_类别的M代码:

let
    Source = Excel.CurrentWorkbook(){[Name="tbl_category"]}[Content],

    #"Filtered Rows" = Table.SelectRows(Source, each ([keywords] <> null)),

    #"Replaced Value" = Table.ReplaceValue(#"Filtered Rows"," ","",Replacer.ReplaceText,{"keywords"}),
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Replaced Value", {{"keywords", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "keywords"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"keywords", type text}})
in
    #"Changed Type1"
let
Source=Excel.CurrentWorkbook(){[Name=“tbl_category”]}[Content],
#“筛选行”=表。选择行(源,每个([关键字]null)),
#“替换值”=表.ReplaceValue(#“筛选行”、“”、“”、replace.ReplaceText、{“关键字”}),
#“按分隔符拆分列”=Table.ExpandListColumn(Table.TransformColumns(#“替换值”、{“关键字”、Splitter.SplitTextByDelimiter(“,”,QuoteStyle.Csv),让itemType=(type nullable text)meta[Serialized.text=true]在{itemType}}}类型中,“关键字”),
#“Changed Type1”=Table.TransformColumnTypes(#“按分隔符拆分列”,{{{“关键字”,键入text}})
在里面
#“已更改类型1”

格里茨你好,非常感谢你的回答。。。但我没有成功。第一个代码按预期工作(但结果表未显示在屏幕截图中),第二个代码不适用于“tbl_类别”。。。这在您的屏幕截图中有说明,因此我尝试替换“(之前)=>Table.SelectRows(tbl_category)”,以指向第一个代码的结果表。这样它不会给出任何错误,但结果列充满“null”,而在使用“Table.ExpandTableColumn”之前,每个单元格中都有一个表(2列&一行或多行)我也不知道为什么…顺便说一句,我也希望避免在结果表中创建更多的行,并希望在结果“category”列中检索匹配的类别作为文本好吧…我没有注意到table.ExpandTableColumn(#“Added Custom”、“category”、{“category”}、{“category”}、{“category”})中的第一个{“category”}是嵌套表中列的名称…我进行了更正,现在它的工作方式与您描述的一样:)我现在只需要避免行重复,并在结果列中以文本字符串的形式检索匹配类别的列表(通过清除重复项)。我试图替换表。按表展开。拆分,列表。FromTable,等等。。。。但是还没有找到有效的方法嗨,非常感谢你的回答。。。但我没有成功。第一个代码按预期工作(但生成的表未显示在屏幕截图中),第二个代码不工作