想象一下,我们正在使用权力查询来清洁数据,并需要将值替换为转换过程的一部分。
对于我们要替换的每个值,我们必须创建一个替换值步骤在查询。如果我们有数十甚至数百个值来替换,那么它可能是非常繁琐的。
如果我们已经有一个我们需要替换的值列表,那么如果我们可以根据列表一步一步完成所有这些值!
在此帖子中,我们将学习如何根据值列表进行批量查找并替换在电源查询中。
目录
视频教程
设置
在这个例子中,我们有一个小表,其中有一列叫做职称并且表已被命名mydata..这是我们要使用我们的查找和替换功能转换的数据。
我们还有一个有两列的表叫做寻找和取代它被命名myfindreplace..这是用于查找和更换的一对项目的表。
列实际上可以命名为任何内容,因为我们不会按名称引用它们。重要的是查找列在左侧,替换列在右侧。
然后,我们需要将这些表导入功率查询。去吧数据然后按下表/距离命令将它们导入电源查询编辑器。
使用替换值在功率查询中
在电源查询编辑器内时,我们可以执行a替换值从中迈出转变选项卡或右键点击菜单。
选择要替换值的列并转到转变标签并按替换值命令。
我们也可以通过右键单击在列标题上然后选择替换值从菜单中。
这两种选择都会打开替换值菜单,我们可以进入价值发现和值用。。。来代替.
这将替换整个列中的每个实例。
=表。取代Value(#"Changed Type","Text to find","Text to replace",Replacer.ReplaceText,{"Job Title"})
如果我们看看M代码这是由此产生的,我们可以看到它正在使用表格ReplaceValue电源查询功能要执行替换。
我们也将在我们的解决方案中使用这个函数,但是没有基于值列表使用这个函数的简单方法。为此,我们需要创建自己的自定义查询函数。
用于查询函数的M代码
让BulkReplace =(作为表,SendReproColable作为表,DataTableColumn类列表)=> ver //使用table.torows函数//将findreplacetable转换为列表,以便使用索引号findreplacelist = table.torows引用列表(findreplacetable),// findreplacetable中的行数以确定//需要多次迭代计数器= table.rowcount(findreplacetable),//定义一个函数以迭代我们的列表//使用table.replaceValue函数bulkreamevalues=(dataTableTemp,n)=>使用nth项目在findreplacelist中替换= table.replaceValue(datatableTemp,//在nth项目中替换null inful findreplacelist {n} {0} = null)然后“”findreplacelist {n} {0},如果findreplacelist {n} {1} = null那么“”findreplacelist {n} {1},retwinger.replacetext,datatablecolumn),如果我们不是findreplacelist /的末尾//然后迭代table.replaceValue如果n =计数器 - 1然后是可替代的否则@bulkreplaceValues(可替换,n + 1),//评估第一个行输出= Bulkreplace输出中的第一个行输出= BulkreplaceValues(DataTable,0)的子功能
在上一篇文章中在电源查询中复制Excel的TRIM功能,我们通过步骤来创建查询函数。我们需要遵循上面的相同步骤M代码.
这个查询函数有3个参数。
- 数据可图表中包含要查找和替换值的列。
- FindReplaceTable是一个两列表。第一列包含要查找的值,第二列包含要替换它们的值。表中的每一行由一对查找和替换值组成。
- DataTableColumn是要在其中查找和替换值的列名列表。
函数然后转换FindReplaceTable查找和替换对的列表,我们遍历它们并应用表格ReplaceValue函数到每对。
如何使用此功能
我们如何使用此查询函数比我们不同修剪函数例子。在这种情况下,我们通过添加自定义列将函数应用于列中的每一行。
要使用此功能,我们需要将其应用于整个列。
我们需要添加一个查询步骤。从我们想要使用此功能的查询,我们可以点击小外汇公式栏右侧的图标。
= fBulkReplace(#"更改类型",MyFindReplace,{"工作标题"})
然后,我们可以输入上述功能。
第一个参数将引用查询中的前一步。在我们的例子中,这是一个名为的步骤改变了类型.
第二个参数将引用包含查找和替换值表的查询的名称。在我们的例子中,这个叫做myfindreplace..
第三个参数将引用要在其中替换值的列的名称。它需要是使用花括号的列表格式。在我们的案例中,这是{“职称”}
.
注意,我们可以使用这个参数对多个列应用查找和替换。例如,将{“职称”,“职位描述”}
在第三个参数中将查找和替换应用于职称和工作描述列。
结论
通过一些巧妙的操作,我们能够创建一个函数,该函数可以根据值列表执行批量查找和替换步骤。
关键是根据查找和替换值列表的索引创建递归函数。
我们甚至可以使用此解决方案同时在多列上执行查找并替换以节省更多时间。
递归查询函数在电源查询中的另一个伟大用途!
谢谢你。这太好了。但是,我有我的数据x和xy或xz。我希望函数只替换相同的单元格内容,因此只有x而不是xy的x。
是否有可能替换整个小区内容而不是字符串的唯一部分?
是的,我想是的,但我还没有测试过。
在查询函数中,替换任何实例替换器.ReplaceText.和替代者。取代Value.
谢谢约翰。我尝试过这个,但可能是因为“myfindplace”表有大约1000行,“mydata”有2000行,excel死亡我在查询中应用函数后。这是因为巨大的数据理由还是其他东西?
是的,可能会有太多的替代品。递归函数不被认为是“最佳实践”。
嗨,约翰
这是很棒的…但我如何得到数据清理我的原始表,而不只是创建一个新的?
添加具有清除数据的列以现有或更换原始数据。
这可能吗?
(当你连接到最后的时候,我没有看到相同的框
您的数据源是什么?
我的原始数据是通过电源查询清理的Excel文件
一些材料ID虽然不正确,所以我必须替换那些并添加新的清理列或更新原始列
我真的很喜欢你的版本,在那里我可以添加未来的错误材料ID可以清洁,所以真的想要用它来做
这应该是实际的工作:
=表。AddColumn(# " Changed Type2″," SP Material ID Cleaned ", each if [SP Supplier Material ID Original] = " 11-0016 " then 110016 else if [SP Supplier Material ID Original] = " 20-4038 " then " 22-4038 " else [SP Supplier Material ID Original])
手动添加文本差值,很简单
我的原始数据是通过电源查询清理的Excel文件
一些材料ID虽然不正确,所以我必须替换那些并添加新的清理列或更新原始列
我真的很喜欢你的版本,在那里我可以添加未来的错误材料ID可以清洁,所以真的想要用它来做
Br
Jette
嘿约翰,
我喜欢这个!它对我提供了极大的帮助。
但是,我遇到了一些问题......
我想找到
酒吧杏仁黄油
条状杏仁黄油盒8ct
取代W /
杏仁奶油
然而,在我进行加载后,只有BAR ALMOND BUTTER更改了....没有对BAR ALMOND BUTTER BOX 8CT进行更改。
我在寻找答案时发现这篇文章 -https://www.thebiccountant.com/2016/05/22/multiple-replacemense-in-power-bi-and-power-query/
无论如何你可以将上面发现的内容应用于你的公式吗?
这是表格的一个示例。
查找/ /替换
酒吧杏仁黄油//杏仁黄油
杏仁黄油条盒8ct //杏仁黄油
我可以确认你的大容量替换函数工作时,字符串是不相似的。
对于你的情况,我认为你可以重新排序。试着用下面的表格代替:
查找/ /替换
杏仁黄油条盒8ct //杏仁黄油
酒吧杏仁黄油//杏仁黄油
但更简单的方法是在查询函数中,替换任意的实例替换器.ReplaceText.和替代者。取代Value.这将发现只替换整个值,而不是值的一部分。
嗨,约翰,
谢谢你的解决方案。
我可以使用相同的M代码我的数据,我试图以相同的方式工作,你在视频和图片中显示。
但是我没有工作。
等待你的回复。
问候,
帕潘
成功了,再试一次。
嗨,约翰,
谢谢你的代码。它的工作就像一个谜题替换特定列上的值。但是,当我想在同一查询中将函数应用于另一列时,原始列恢复回原始值。我如何通过代码挖掘代码,以便一次可以在多列上应用函数?提前致谢。
选择两列并执行UI的替换值。查看M代码,这基于此生成并调整代码。
嗨约翰,非常感谢您分享您的知识。我是一个痛苦的问题。当我运行函数时,显示出意外的erro:表达式.Error:函数预期5参数(详细信息:Pattern =,Arguments = [List]可以帮助吗?谢谢。
我无法开始描述我讨厌这篇文章的方式,诱骗了我想要实现的东西,然后是Blahblahah的一点,我讨厌它
谢谢!这就像魅力一样。
听好!