Как переименовать заголовки с помощью цикла в Power BI?

У меня возникла ситуация, когда мне нужно переименовать заголовки на основе таблицы со старым именем (HeadersTranslated[HeaderList]), новым именем (HeadersTranslated[HeaderEnglish]) и номером индекса (HeadersTranslated[Indeks]).

Поэтому я пытаюсь перебирать номера индексов и выполнять переименование для каждого.

Однако я не могу заставить его работать более чем с 1 столбцом за раз (путем замены StartTheLoop(HeadersTranslated[Indeks]) на StartTheLoop(0), например, ниже:

let
   Source = Data_Cyrillic,
   #"Promoted Headers" = Table.PromoteHeaders(Source,[PromoteAllScalars=true]),
   #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Column1", type number}, ... , {"Column52", type number}}),

   StartTheLoop = (MyCounter)=>

   let     
       #"Renamed Columns" = Table.RenameColumns(#"Changed Type",{{HeadersTranslated[HeaderList]{MyCounter}, HeadersTranslated[HeaderEnglish]{MyCounter}}})
   in
       #"Renamed Columns"
in
   StartTheLoop(HeadersTranslated[Indeks])

person JSF    schedule 15.06.2018    source источник


Ответы (2)


Это не использует цикл или индекс, но я считаю, что это решает вашу настоящую проблему.

Если я начну с этой таблицы со столбцами, которые я хочу переименовать, я назову ее Таблица1:

введите здесь описание изображения

А это как моя таблица со списком имен новых столбцов, которые я хочу использовать — я назову эту таблицу NewColumnNames:

введите здесь описание изображения

Затем, работая в Table1, я могу дважды щелкнуть заголовок первого столбца и переименовать его как угодно — я наберу Test:

введите здесь описание изображения

Затем в строке формул замените эту выделенную часть, которая представляет собой список имени столбца, который я заменяю ("Столбец1"), и имени, которым я его заменяю ("Тест")...

введите здесь описание изображения

...с List.Zip({Table.ColumnNames(Source),NewColumnNames[NewColumnNames]}). Это изменение заменяет все исходные имена столбцов именами столбцов из списка NewColumnNames (столбца) в таблице NewColumnNames.

введите здесь описание изображения

Функция List.Zip застегивает, как застежка-молния (не как файловый компрессор). Он сплетает элементы списка вместе, как зубья молнии. В этом случае он берет имя первого столбца «Столбец1» (которое извлекается из списка, полученного функцией Table.ColumnNames(Source)), затем первое имя NewColumnName, «Новый столбец1» (которое извлекается из столбца таблицы NewColumnNames[NewColumnNames]) и помещает их в новом списке. Затем он переходит ко второму имени столбца, затем ко второму NewColumnName и так далее, чтобы создать список списков. Список, который он создает, в основном: {{"Column1", "New Column1"}, {"Column2", "New Column2"}, {"Column3", "New Column3"}, {"Column4", "New Column4"}}.

person Marc Pincince    schedule 15.06.2018

В более общем смысле, если вы хотите иметь Table1 с заменой заголовков столбцов для Table2, вы можете использовать этот код. В этой версии порядок строк между заголовками столбцов Table1 и Table2 не обязательно должен совпадать, а также нет необходимости в соответствующем совпадении для каждой строки в Table1 , поэтому вы можете предварительно заполнить замены заголовков столбцов, которые могут быть еще не нужны.

let
//Table1 is two column table with columns titles Old and New
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
ReplacementTable = Table.TransformColumnTypes(Source,{{"Old", type text}, {"New", type text}}),
//Table2 is any table where column titles will be replaced using Table1
Source2 = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
DemoteHeaders = Table.DemoteHeaders(Source2),
HeaderTransposed =Table.FromList(Table.ColumnNames(Source2)),
#"Merged Queries" = Table.NestedJoin(HeaderTransposed,{"Column1"},ReplacementTable ,{"Old"},"Headers",JoinKind.LeftOuter),
#"Expanded Headers" = Table.ExpandTableColumn(#"Merged Queries", "Headers", {"New"}, {"Headers.New"}),
#"Removed Columns" = Table.RemoveColumns(#"Expanded Headers",{"Column1"}),
HeaderTransposed2 = Table.Transpose(#"Removed Columns"),
CombinedTables = Table.Combine({HeaderTransposed2,DemoteHeaders}),
PromoteHeaders = Table.PromoteHeaders(CombinedTables),
RemoveFirstRowFormerHeaders = Table.Skip(PromoteHeaders,1)
in RemoveFirstRowFormerHeaders
person horseyride    schedule 19.06.2018