我正在尝试动态重命名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
答案 0 :(得分:3)
如果您有一个包含旧名称和新名称的表格,则可以使用以下模式
let
rename_list = Table.ToColumns(Table.Transpose(Table2)),
result = Table.RenameColumns(Table1, rename_list, MissingField.Ignore)
in result
其中Table2是"重命名表"和Table1是包含数据的初始表。
这个想法在这里详细描述 https://bondarenkoivan.wordpress.com/2015/04/17/dynamic-table-headers-in-power-query-sap-bydesign-odata/
答案 1 :(得分:1)
如果您有所需的结果列名称,似乎您可以将Source
转换回行,然后在Table.FromRows
上调用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"},
Result = Table.FromRows(Table.ToRows(Source), List2)
in
Result
(除非假设Name 2
始终是第二列是错误的。)
答案 2 :(得分:0)
最后......使用以下功能
计算出来Table.TransformColumnNames(表为表,nameGenerator为函数,可选选项为可空记录)为表
首先创建一个nameGenerator函数(例如MyFuncRenameColumns),在给定任何原始列名作为输入的情况下提供新的列名。
在我的示例中,这是MyFuncRenameColumns的代码:
active_links(
在这里,您将其用作Table.TransformColumnNames的参数之一:
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
希望能帮助别人!
答案 3 :(得分:0)
根据伊万的解决方案陈述原始问题,这里是。 Carl的结果相同,对于我给出的例子来说有点简单,但是,我的情况将受益于在表格中明确列出重命名对(即表2)。另外,将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