Динамическое переименование полей в Power BI
Если ты прожженный жизнью кликвьюшник, то начиная работать в Power BI, наверняка столкнёшься с той же мыслью, что и я:
А как мне тут переименовать столбцы в одной таблице по значениям из другой?
Другими словами ты захочешь использовать аналог функции «rename fields using mapping ...», которая всем хорошо известна в QlikView.
Порывшись в документации, я не обнаружил ни таблиц мэппинга, ни их аналога в Power BI.
Ну, что ж, отличный повод апнуть свои навыки программирования и написать простенькую функцию «RenameColumnsWithMapping».
Подготовка к работе
Прежде чем начать, давайте создадим подходящие условия. Для этого нам понадобится 2 файла:
- Исходная табличка, в которой мы будем переименовывать поля
- Таблица мэппинга названий
Я создам эти таблицы в Excel.
Исходная табличка (будет в материалах статьи):
Как видим, в ней отсутствуют имена полей. Это значит, что Power BI они будут иметь названия Column1,Column2,Column3... (ну вы поняли).
Одна и та же табличка может использоваться в разных проектах, более того со временем колонки могут меняться местами, что вообще приведет к стихийному бедствию - придется переделывать скрипт во всех приложениях.
Более того, исходные таблицы из разных источников могут иметь разные названия и точно также меняться со временем. Удобнее всего, когда у нас есть специальная таблица в которой описаны метаданные из разных источников и целевые названия, которые будут использоваться при загрузке данных.
Таблица мэппинга (будет в материалах статьи):
Видим, что в ней три колонки:
- «Sales_excel» - наименования полей в источнике данных из Excel
- «Sales_dwh» - наименования полей в источнике данных из DWH (для примера)
- «Sales_pbi» - наименования полей, как они будут выглядеть в Power BI
Теперь давайте загрузим все это в Power BI. Начнем с исходной таблицы:
А теперь и мэппинг:
Далее, нам нужно создать функцию, а затем применить ее к исходной таблице...
Создаем функцию «RenameColumnsWithMapping»
Для того, чтобы создать функцию, сначала необходимо создать пустой запрос:
Для этого нажимаем правой кнопкой но разделу «Queries», в появившемся окне выбираем «New Query» > «Blank Query».
Переименовываем его в «RenameColumnsWithMapping», а после щелкаем по нему правой кнопкой и выбираем «Advanced Editor».
В редакторе добавляем код, приведенный ниже:
(RenameTable as table, OldColumnNames as list, NewColumnNames as list) => let RenameList = List.Zip({OldColumnNames, NewColumnNames}), RenameColumns = Table.RenameColumns(RenameTable, RenameList) in RenameColumns
После того, как вы нажмете «Done», этот пустой запрос автоматически преобразуется в функцию, удобно не правда ли?
Итак, мы создали функцию, которая принимает 3 параметра:
- «RenameTable» - исходная таблица, в которой будем переименовывать поля
- «OldColumnNames» - список со старыми названиями полей
- «NewColumnNames» - список с новыми названиями полей
Теперь давайте применим ее для нашей таблицы «Orders»:
Пояснения к скриншоту:
- Переходим в таблицу «Orders»
- Заходим в «Advanced Editor»
- Применяем функцию «RenameColumnsWithMapping»
В качестве первого аргумента используем предыдущий шаг преобразования таблицы. В качестве второго аргумента - исходные названия полей, и напоследок, в качестве третьего - целевые названия полей.
Ну вот и все! Смотрим результат!
Было:
Стало:
Материалы статьи (скачать):
- PBIX-файл с реализацией
- Excel-файл с исходными данными и мэппингом
Качайте, пользуйтесь, делитесь статьей :)
Если вам понравилась статья или у вас есть идеи как сделать это лучше, пишите мне на почту: me@andbel.it