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