Пропустити навігацію EPAM

Power Query: як працювати з динамічними заголовками стовпців

Богдан Дуда

BI Analyst
Лайфхаки
  • Data

У цій першій статті ми покажемо, як за допомогою можливостей Power Query автоматично усунути змінну кількість порожніх рядків, що розташовані між технічними та змістовними назвами стовпців. Автоматизація цього процесу дає змогу істотно спростити підготовку даних, економить час і забезпечує узгодженість на етапі форматування інформації.

Розгляньмо типову для Power Query ситуацію, коли потрібно об’єднати кілька різних файлів. Хоча цей процес зазвичай є простим,

але виникають ускладнення, якщо файли мають різноманітну структуру, як проілюстровано нижче:

Кожна з ваших таблиць містить чотири однакових за назвою стовпці. Функціонал Power Query щодо об’єднання файлів на основі імен стовпців є беззаперечним. Проте реальні назви стовпців відрізняються від стандартних «Стовпець 1», «Стовпець 2» та інших, являючи собою такі значення як «Товар», «Кількість», «Ціна» та «Дата». Ускладнення виникає через невідповідність порядку цих стовпців у різних таблицях. Без додаткових маніпуляцій, об’єднання даних призведе до некоректного порівняння, наприклад, кількості із ціною, що є неприпустимим. Розгляньмо, як за допомогою можливостей Power Query розв’язати цю проблему.

Після підключення до наявних таблиць, ми отримуємо чотири набори даних для подальшої обробки.

Кожна з таблиць містить декілька рядків, розташованих між тимчасовими назвами стовпців («Стовпець1», «Стовпець2» тощо) та їхніми фактичними іменами («Товар», «Кількість» тощо). Нашим першим кроком є пропуск цих рядків, які містять пусті значення. Однак кількість таких рядків варіюється в різних таблицях. Для визначення кількості рядків, які необхідно пропустити, використовується наступна формула мови M:

=Table.AddColumn(#"Removed Columns", "Custom", each List.PositionOf([Content][Column1],"Goods"))

Завдяки цій формулі ми додаємо додаткові стовпці, у яких визначаємо позиції рядків, що містять значення «Товар».

ПРИЄДНУЙСЯ ДО НАШОЇ КОМАНДИ

Цей підхід є дієвим, однак, як продемонстровано на скріншоті вище, можуть виникати значення -1. Для усунення цієї проблеми необхідно відповідно модифікувати формулу.

Тобто ми кажемо, якщо ти не знаходиш у першому стовпці значення «Goods», то пошукай там значення «Price».

Отже, ми отримали такий результат:

Визначивши номери рядків, що містять фактичні назви стовпців, можна братися до видалення всіх рядків із пустими значеннями, розташованих вище них. Для цього використовується наступна формула мови M:

= Table.ReplaceValue(#«Added Custom», each [Content],each Table.Skip([Content],[Custom]),Replacer.ReplaceValue,{«Content»})

У результаті отримуємо наступний результат:

Коротке пояснення цієї формули виглядає так: за допомогою формули Table.Skip видали пусті рядки зверху, а саме ту кількість, яку ми порахували попередньою формулою в колонці «Custom».

Також є ще один необхідний крок: підвищення рівня заголовків перед розкриттям таблиці. Для цього використовується наступна формула мови M:

= Table.ReplaceValue(#«Replaced Value»,each [Content],each Table.PromoteHeaders([Content]),Replacer.ReplaceValue,{«Content»})

Як бачимо, ми отримали коректні назви стовпців, що гарантує відсутність проблем із їхнім порядком.

Наступним кроком буде розкриття всіх таблиць:

Й ось ми можемо насолодитися фінальним результатом:

Отже, якщо підсумувати наше завдання, то воно полягає в трьох кроках:

  1. За допомогою формули List.PositionOf визначати кількість пустих рядків над рядком справжніх заголовків.
  2. За допомогою формули Table.Skip видалити ці пусті рядки.
  3. За допомогою формули PromoteHeaders зробити верхній рядок заголовками, усунувши тим самим технічні назви «Column1», «Column2» тощо.

І тільки після цих маніпуляцій можна робити розкриття таблиць.

Підписатися на новини

Чудово! Ми вже готуємо добірку актуальних новин для вас :)

Вибачте, щось пішло не так. Будь ласка, спробуйте ще раз.

* Обов'язкові поля

*Будь ласка, заповніть обов’язкові поля

Вакансії EPAM Ukraine у Київ | Львів | Харків | Дніпро | Вінниця | Івано-Франківськ | Одеса | Чернівці | Хмельницький | Рівне | Ужгород | Тернопіль | Луцьк за напрямком Java | JavaScript | .NET | DevOps | Experience Design | Software Testing | Business Analysis | Python| Big Data | Mobile | Solution Architect | Ruby on Rails у містах за напрямком Java вакансії Київ | Java вакансії Харків | Java вакансії Львів | Java вакансії Вінниця | Java вакансії Одеса | Java вакансії Івано-Франківськ | Java вакансії Чернівці | Java вакансії Хмельницький | Java вакансії Рівне | Java вакансії Ужгород | Java вакансії Тернопіль | Java вакансії Луцьк | JavaScript вакансії Київ | JavaScript вакансії Харків | JavaScript вакансії Львів | JavaScript вакансії Вінниця | JavaScript вакансії Одеса | JavaScript вакансії Івано-Франківськ | JavaScript вакансії Чернівці | JavaScript вакансії Хмельницький | JavaScript вакансії Рівне | JavaScript вакансії Ужгород | JavaScript вакансії Тернопіль | JavaScript вакансії Луцьк | DevOps вакансії Київ | DevOps вакансії Харків | DevOps вакансії Львів | DevOps вакансії Вінниця | DevOps вакансії Одеса | DevOps вакансії Івано-Франківськ | DevOps вакансії Чернівці | DevOps вакансії Хмельницький | DevOps вакансії Рівне | DevOps вакансії Ужгород | DevOps вакансії Тернопіль | DevOps вакансії Луцьк