MyTetra Share
Делитесь знаниями!
СОБРАТЬ ДАННЫЕ С ТАБЛИЦ С ИЗМЕНЯЮЩИМИСЯ СТОЛБЦАМИ В POWERQUERY
Время создания: 17.03.2022 11:34
Текстовые метки: Power Query, ExpandTableColumn
Раздел: Разные закладки - MSO - Excel - Power Query
Запись: xintrea/mytetra_db_adgaver_new/master/base/1647506073qut3rcu68z/text.html на raw.githubusercontent.com

    #"Развернутый элемент Data" = Table.ExpandTableColumn(old_step, "Data",

                                    Table.ColumnNames(old_step{0}[Data]),

                                    Table.ColumnNames(old_step{0}[Data]))

                                   

ColNames = Table.AddColumn(#"Удаленные столбцы1", "cols", each Table.ColumnNames([Data]), type list),

allCols = List.Sort(List.Distinct(List.Combine(ColNames[cols]))),

#"Развернутый элемент Data" = Table.ExpandTableColumn(#"Удаленные столбцы1", "Data", allCols, allCols)

in

#"Развернутый элемент Data"

 

ColNames = Table.AddColumn(#"Удаленные столбцы1", "cols", each Table.ColumnNames([Data]), type list) - этой строкой мы создаем новый пользовательский столбец, в котором перечислены имена столбцов всех таблиц(each Table.ColumnNames([Data]))

allCols = List.Distinct(List.Combine(ColNames[cols])) - здесь мы объединяем все столбцы в один список(List.Combine(ColNames[cols])) и удаляем из списка дубликаты(List.Distinct). Кстати, один из известных спецов по Power Query Максим Зеленский предложил более изящный вариант этой строки: allCols = List.Union(ColNames[cols]). Получается даже чем-то лучше, т.к. столбцы располагаются в более правильном порядке.

#"Развернутый элемент Data" = Table.ExpandTableColumn(#"Удаленные столбцы1", "Data", allCols, allCols) - это по сути та же строка, что в исходном запросе, но имена столбцов сюда уже подставляются только те, которые есть в таблицах для выгрузки.

Полностью запрос теперь выглядит так:

 

Полностью запрос теперь выглядит так:

let

  Источник = Folder.Files("G:\Работа с Excel\1_PowerQuery\PowerQuery таблицы с разными столбцами"),

  #"Строки с примененным фильтром" = Table.SelectRows(Источник, each ([Extension] = ".xlsx")),

  #"Удаленные столбцы" = Table.RemoveColumns(

    #"Строки с примененным фильтром",

    {"Date accessed", "Date modified", "Date created", "Attributes", "Folder Path"}

  ),

  #"Добавлен пользовательский объект" = Table.AddColumn(#"Удаленные столбцы", "Данные", each Excel.Workbook([Content])),

  #"Развернутый элемент Данные" = Table.ExpandTableColumn(

    #"Добавлен пользовательский объект",

    "Данные",

    {"Name", "Data", "Item", "Kind", "Hidden"},

    {"Name.1", "Data", "Item", "Kind", "Hidden"}

  ),

  #"Строки с примененным фильтром1" = Table.SelectRows(#"Развернутый элемент Данные", each ([Kind] = "Table")),

  #"Удаленные столбцы1" = Table.RemoveColumns(#"Строки с примененным фильтром1", {"Name.1", "Item", "Kind", "Hidden"}),

  ColNames = Table.AddColumn(#"Удаленные столбцы1", "cols", each Table.ColumnNames([Data]), type list),

  allCols = List.Sort(List.Distinct(List.Combine(ColNames[cols]))),

  #"Развернутый элемент Data" = Table.ExpandTableColumn(#"Удаленные столбцы1", "Data", allCols, allCols)

in

  #"Развернутый элемент Data"

 

Теперь какие бы таблицы мы не кидали в папку - запрос получит из них данные без дополнительных действий с нашей стороны.

Но не стоит забывать: если дальше в запросе так же идет обращение к столбцам, которые могут изменяться - это тоже придется учесть в запросе и так же составлять некие "динамические" заголовки.

 

Так же в этом разделе:
 
MyTetra Share v.0.62
Яндекс индекс цитирования