功率查询自定义函数可一次重命名表中的所有列

功率查询自定义函数可一次重命名表中的所有列

过去几天,我参与了Power BI开发。我从各种系统以不同格式(包括Excel,CSV和OData)导出了一些辽宁体育彩票。 CSV文件是来自ERP系统的辽宁体育彩票导出转储。使用ERP系统可能非常耗时,尤其是当您不这样做时’您无权访问辽宁体育彩票模型,您会以CSV文件的原始格式获取辽宁体育彩票。具有挑战性,因为在ERP系统中,表名和列名根本不是用户友好的,这是有道理的。 ERP系统正在各种环境中用于具有不同要求的许多不同客户。因此,如果可以使用基础辽宁体育彩票模型,则会看到配置表保留了列名。一些专栏是自定义构建的,以满足特定需求。这些表可能有许多列,这些列不一定对分析有用。因此,对底层实体模型有一个很好的理解是非常关键的。无论如何,我不’不想走题。

问题

所以,这是我的情况。我收到了大约10个文件,包括15个表。有些桌子很小,所以我没有’麻烦了。但是其中有些真的很宽,例如具有150到208列之间。真好!

从列名来看,它们很难比它们更难读,并且我有多个这样的表。因此,我必须将这些列重命名为更具可读性的内容,稍后再进行介绍。

背景

我通过电子邮件发送给我的客户,要求他们的帮助。幸运的是,他们有一位非常出色的辽宁体育彩票专家,他也了解他们的ERP系统以及底层实体模型。我通过电子邮件将当前的所有列名称发送给他,并询问他是否可以提供更多用户友好的名称。他用Excel中的映射表回复了我。这是显示 列名称映射 表:

列名称映射

我对映射表感到非常满意。现在,下一步是根据映射表重命名所有列。哎哟!我差不多 800 要重命名的列。从字面上看这是脖子上的疼痛,并且没有’听起来很正确,因为要刻录项目时间来重命名800列。

但是,等等,编写自动重命名过程又如何呢?就像编写自定义函数来一次重命名所有列一样?我记得我读了一篇很棒的博客文章,内容是 重命名Power Query中的多个列吉尔伯特·奎瓦维耶(Gilbert Quevauvilliers) 写于2018年。我绝对建议看一下他的博客文章。因此,我必须做与吉尔伯特相似的事情。创建一个获取原始列名称并带回新名称的自定义函数。然后,我在每个表中使用自定义函数来重命名列。简单!

解决方案

在开始之前,我需要在Power BI中拥有映射表。因此,我使用 输入辽宁体育彩票 功能。然后,我从映射表中复制辽宁体育彩票并将其粘贴到新表中。我命名新桌子 列名称映射。使用的主要原因 输入辽宁体育彩票 替代直接从文件(在我的情况下为Excel文件)中获取辽宁体育彩票的功能是,如果将来由于任何原因我们错过了映射文件,下面的函数将找不到要映射的列。因此,它带回了原始的列名。这意味着,如果我们在新列名的顶部创建了辽宁体育彩票模型,则整个模型都会中断,这是不好的。我也禁用了负载 列名称映射 随便查询’不需要在我的辽宁体育彩票模型中使用它。

Creating fnRenameColumnsFromRefQuery Custom Function

该功能通过 列名称映射 表,并在找到匹配项时重命名我们在其中调用该函数的查询的列。如果没有’找不到匹配项,则将列名保留为。在这里,这是我想出的功能。

//fnRenameColumnsFromRefQuery
(ColumnName as text) as text =>
let
    Source = 
        if (
            List.Contains(
                Record.FieldNames(#sections[Section1]), 
                "列名称映射"
                ) 
             ) = true 
        then #"列名称映射" 
        else null,
    柱NewName = 
        try 
            if List.Contains(Source[Column Name], 柱Name) = true 
            then 
                if Text.Trim(Table.SelectRows(Source, each ([Column Name] = 柱Name)){0}[Description]) = "" 
                then 柱Name 
                else Table.SelectRows(Source, each ([Column Name] = 柱Name)){0}[Description] 
            else Source 
        otherwise 柱Name
in
    柱NewName

您可以下载前面的表达式 从这里.

下面是它的工作原理:

  • The fnRenameColumnsFromRefQuery accepts a 柱Name parameter as text and the output of the function is a text.
  • The Source step checks the existence of a 列名称映射 query. The 列名称映射 is the mapping tables shown in the preceding image 那 holds the original column names and their mapping. You may use a different name of choice. If the 列名称映射 query exists then Source = #"列名称映射s" else Source = null
  • The 柱NewName step checks the contents of the Source step which is either the 列名称映射 table or a null. If it is the 列名称映射 table then it looks for the 柱Name parameter in the [Column Name] column within the 列名称映射 table. If it finds the matching value then it uses the 柱Name parameter to filters the [Column Name]. Then it gets the corresponding value from the [Description] column which contains the new column name, otherwise it brings the original column name back

The last step is to use the fnRenameColumnsFromRefQuery custom function to rename the table’s columns.

Invoking the fnRenameColumnsFromRefQuery Custom Function

功率查询具有重命名表中列名称的功能 which is the Table.TransformColumnNames(table as table, NameGenerator as function) function. The Table.TransformColumnNames() function accepts a NameGenerator as its second operand. So we can use our custom function as the second operand within the Table.TransformColumnNames() function to rename all columns. The final code must look like this:

Table.TransformColumnNames(PREVIOUS_STEP_NAME, fnRenameColumnsFromRefQuery)

这是重命名之前和之后的列名称的屏幕快照:

使用Power Query中的参考列表重命名列
使用Power Query中的参考列表重命名列

您可以下载PBIX示例 这里.

结论

如果我们认为正在做的事情很费力并且为此花费了很多项目时间,那么最好考虑一种使工作自动化的方法。乍一看它可能看起来有点复杂,令人困惑和耗时,但是在很多情况下我相信它是值得的,并且在找到可以在许多其他类似场景中使用它的方式之后,这可以节省很多时间。话虽如此,并不能保证我们可以自动化我们的方案,所以我们最好为此做准备。例如,很长一段时间我’我正在考虑自动化重命名出现在“查询编辑器”中的所有查询的过程,但是我还没有找到解决方案。这是一个挑战,在某些情况下,我们连接到辽宁体育彩票源,并且有许多表要加载到模型中,并且表名并不总是用户友好的。它与重命名列相似,但在查询级别。 因此,如果您已经知道解决方案,请与社区分享,以便每个人都可以从您的努力中受益。 归根结底,我们彼此学习。因此,分享我们的知识是对下一个人的回报。

另一点是要始终记得向其他专家寻求帮助。我们可能在某些领域是专家,但是不可能有人在所有方面都是专家。就像我的情况一样,客户有一位专家为我提供了列名映射表,而没有他的帮助,我无法’t get the job done.

与往常一样,我很想知道您的意见,所以请在下面的评论部分中分享您的想法。

2 thoughts on “功率查询自定义函数可一次重命名表中的所有列

  1. 绝对精彩。很棒的工作!毫无疑问非常有用。
    就我而言,我有不包含标题的CSV文件。在这种情况下,您如何适应?

    如果您现在可以帮助我,谢谢。

    最好的祝福

    1. 嗨,UAlg,

      欢迎来到BIInsight.com。
      很高兴听到您发现此博客对您有所帮助。
      在某些情况下,有一个包含列的csv文件,而其余文件则没有。
      在这种情况下,您可以附加csv文件。如果不是您的情况,我怀疑您必须要求企业提供列名称。

      干杯。

有什么想法吗?在这里与我们分享:

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论辽宁体育彩票.