使用Power Query动态重命名一组列

3
我正在尝试在Power Query中动态重命名一组列,List1是原始列名,List2是新列名。我认为需要将List1和List2合并为一对列表,但无法确定正确的语法。
非常感谢!
    let

    //list of original column names 
    List1= {"Name1","Name2","Name3","Name4"},

    //Create test table
    Source = Table.FromRows({{1231,1233,4121,5232},{3546,3426,1246,3464}} , List1),

    //list of new column names
    List2 = {"NewName 1","NewName 2","NewName 3","NewName 4"},

    //Rename columns (in practice, the two lists of names will be dynamic, not hard coded as below)
    Result = Table.RenameColumns(Source, {
        {"Name1","NewName 1"},
        {"Name2","NewName 2"},
        {"Name3","NewName 3"},
        {"Name4", "NewName 4"}})

    in
        Result
4个回答

4

谢谢Ivan,我会看一下这个的。 - Brian Mather
我喜欢它 - 它总是能正确地配对旧名称/新名称对。Table.ToColumns(Table.Transpose...) 很好地解决了“我需要将List1和List2合并成一对列表”的问题,因为它是 Table.RenameColumns 的第二个参数。我可以通过使用 Table2 = Table.FromRows({List1,List2}) 跳过 Table.Transpose。为了完整起见,我将在我的原始问题中逐步展开它。 - Brian Mather
1
谢谢Ivan,我已经使用你的解决方案重新表述了原始示例。非常感谢你的帮助。 - Brian Mather

1
根据伊万的解决方案,以下是原始问题陈述。卡尔的结果相同,在我给出的示例中稍微简单一些,但是我的情况将受益于在表格中明确设置重命名对(即Table2)。此外,使用MissingField.Ignore参数与Table.RenameColumns一起使用意味着它只会更改我想要重命名的列的选择,在生产查询中其余部分将保持不变。
let

    //list of original column names 
    List1= {"Name1","Name2","Name3","Name4"},

    //Create test table
    Source = Table.FromRows({{1231,1233,4121,5232},{3546,3426,1246,3464}} , List1),

    //list of new column names
    List2 = {"NewName 1","NewName 2","NewName 3","NewName 4"},

    //Rename columns (in practice, the two lists of names will be dynamic, not hard coded as below)

    //Bring List1 and List2 together as rows in a table
    Table2 = Table.FromRows({List1,List2}),

    //Create a list of rename pairs 
    RenameList = Table.ToColumns(Table2),

    //Call to Table.RenameColumns 
    Result = Table.RenameColumns(Source, RenameList, MissingField.Ignore)

in
    Result

1
如果你已经有了想要的结果列名,似乎可以将 Source 转换回行,然后在 List2 上调用 Table.FromRows
let

    //list of original column names 
    List1= {"Name1","Name2","Name3","Name4"},

    //Create test table
    Source = Table.FromRows({{1231,1233,4121,5232},{3546,3426,1246,3464}} , List1),

    //list of new column names
    List2 = {"NewName 1","NewName 2","NewName 3","NewName 4"},

    Result = Table.FromRows(Table.ToRows(Source), List2)

in
    Result

(除非假设例如名称2总是第二列,否则不正确。)

谢谢卡尔,我会看一下这个的。它看起来确实比我的解决方案简单多了! - Brian Mather
我喜欢 Table.ToRows 如何剥除列名,Table.FromRows 再用 List2 作为新的列名重新构建表格。正如您所说,替换的列名需要按照 List2 中正确的顺序列出。 - Brian Mather
2
我选择了Ivan的答案,因为在生产环境中,我有一些不想重命名的列,而且我一直在尝试弄清楚如何正确使用Table.RenameColumns函数。通过阅读您的解决方案,我学到了很多,非常感谢! - Brian Mather

0

终于...使用以下函数找到了解决方法

Table.TransformColumnNames(table as table, nameGenerator as function, optional options as nullable record) as table

首先创建一个名为nameGenerator的函数(例如MyFuncRenameColumns),以提供任何原始列名称作为输入时的新列名称。

在我的示例中,这是我用于MyFuncRenameColumns的代码:

    let
        MyFunctionSwitchColumnName = (originalColumnName) as text =>
        let
            //list of original column names 
            List1= {"Name1","Name2","Name3","Name4"},

            //Create table
            Source = Table.FromRows({{1231,1233,4121,5232},{3546,3426,1246,3464}} , List1),

            //list of new column names
            List2 = {"NewName 1","NewName 2","NewName 3","NewName 4"},

            //Create table matching List1 to corresponding new value in List2
            CreateRecord = Record.FromList(List2,List1),
            ConvertedtoTable = Record.ToTable(CreateRecord),

            //Filter table to just the row where the input originalColumnName matches 
            ReduceExcess = Table.SelectRows(ConvertedtoTable, each [Name] = originalColumnName),

            //Return the matching result in the [Value] column (or give the original column name if there was no valid match)
            NewColumnName = try ReduceExcess{0}[Value] otherwise originalColumnName

        in 
            NewColumnName
    in
        MyFunctionSwitchColumnName

这里是在 Table.TransformColumnNames 的参数之一中使用它的地方:

    let
        //list of original column names 
        List1= {"Name1","Name2","Name3","Name4"},

        //Create table
        Source = Table.FromRows({{1231,1233,4121,5232},{3546,3426,1246,3464}} , List1),

        RenameColumns = Table.TransformColumnNames(Source, MyFuncRenameColumns)
    in
        RenameColumns

希望这能帮助到某个人!


你说的是“TransformColumnTypes”,你是不是想说“TransformColumnNames”? - Oğuz Yıldız
除非您对重命名列的功能有一些复杂的要求,否则我在这里提供的解决方案过于繁琐和复杂。虽然知道Table.TransformColumnNames函数的存在很好,但如果您只是需要简单地切换列名,则Ivan和Carl的答案都更简单。 - Brian Mather

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接