Страницы: 1
RSS
Power Query обращение к полю по номеру столбца
 
Доброго дня, всем.

Уважаемые, кто подскажет, имеется ли возможность обращаться к полям таблицы не по имени, а по номеру позиции.
Проблема в том, что в табличках, которые приходится подгружать каждый день новые имена полей (например даты), а умножать на цену нужно именно поле [03.12.2016] которое находится на 4 месте в примере? Как в запросе обратиться к полю по номеру столбца в таблице?
Привожу пример, как я это делаю сейчас через понижение/повышение заголовков, но есть ощущение что это костыль и можно как-то правильнее что ли.
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Sales"]}[Content],
    #"Пониженные заголовки" = Table.DemoteHeaders(Источник),
    #"Столбец с суммой" = Table.AddColumn(#"Пониженные заголовки", "Сумма продаж сегодня", each [Column3]*[Column4]),
    #"Замененные ошибки" = Table.ReplaceErrorValues(#"Столбец с суммой", {{"Сумма продаж сегодня", null}}),
    #"Повышенные заголовки" = Table.PromoteHeaders(#"Замененные ошибки", [PromoteAllScalars=true]),
    #"Переименованные столбцы" = Table.RenameColumns(#"Повышенные заголовки",{{"Column7", "Сумма продаж сегодня"}})
in
    #"Переименованные столбцы"
Изменено: PooHkrd - 26.01.2022 13:19:49
Вот горшок пустой, он предмет простой...
 
Я сделал только пример на основе Вашей таблицы, а не решил Вашу задачу.
Попробуйте использовать "Table.ColumnNames". Эта функция возвращает массив, содержащий заголовки столбцов, и затем можно обращаться к нужному заголовку по порядковому номеру в этом массиве, выбирая нужный заголовок. Нумерация в массиве начинается с нуля, поэтому в Вашем случае нужно использовать число 3, чтобы обратиться к 4-му заголовку.
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Sales"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Код", Int64.Type}, {"Товар", type text}, {"Цена", Int64.Type}, {"03.12.2016", Int64.Type}, {"02.12.2016", Int64.Type}, {"01.12.2016", Int64.Type}}),
    #"SelCol" = Table.SelectColumns(#"Измененный тип", Table.ColumnNames(#"Измененный тип"){3})
in
    #"SelCol"
 
Всегда умножать 4-й столбец на столбец "Цена":

Код
= Table.AddColumn(Источник, "Сумма продаж сегодня", each Record.FieldValues(_){3}*[Цена])
Изменено: Максим Зеленский - 12.05.2017 16:56:13 (упростил)
F1 творит чудеса
 
Спасибо за наводку, но пока не получается применить к своей задаче.
Пытаюсь обращаться к столбцу через функцию Table.Column() с указанием поля через Table.ColumnNames но она на выходе дает ошибку и в её описании говорит что не может применить оператор * к операндам типа List. Значит нужно как-то показать что требуется перемножать соответствующие элементы из двух списков. Как, пока не понятно. Буду копать дальше, как найду выложу пример, если раньше не подскажет кто еще.
Изменено: PooHkrd - 24.02.2022 17:33:55
Вот горшок пустой, он предмет простой...
 
Максим Зеленский,
Круто! Работает.
Огромное спасибо!
А как в функции Record.FieldValues(_) работает обращение к таблице через знак "_" ? Там же должно быть обращение к данным типа Record?
Изменено: PooHkrd - 23.12.2021 06:14:14
Вот горшок пустой, он предмет простой...
 
А, это любопытно. Функция Table.AddColumn - итератор, она перебирает кажду строку и выполняет некое действие.
Конструкция each + _ обозначает "для каждой строки", где _ это текущий элемент перечисления, в нашем случае - строка.

Можно по-другому посмотреть:
Таблица может быть рассмотрена как список записей. Чтобы добавить столбец, в каждую запись надо добавить поле. Перебираем список, на каждом шаге передавая текущую запись как аргумент для функции. При использовании each текущий элемент перебора обозначается как "_"
F1 творит чудеса
 
Максим Зеленский, огромное вам спасибо.
Очень помогли и здорово объяснили.
Изменено: PooHkrd - 22.12.2021 06:30:11
Вот горшок пустой, он предмет простой...
 
Добрый день.

Дабы не создавать новую тему, попробую спросить здесь. Подскажите пожалуйста, что прописать в настраиваемом столбце, чтобы в нем выводились данные из столбца, который находится левее или правее столбца, имя которого мне известно. Другими словами, условно половина таблицы имеет плавающую структуру - в ней добавляются столбцы с неизвестными именами, в то время как другая половина по своей структуре не меняется. Хотелось бы иметь возможность ссылаться на новые столбцы, указывая в качестве отправной точки один из тех столбцов, что остаются без изменений. Например, указать имя столбца и задать параметр что-то вроде -3, обозначив тем самым что я хочу видеть данные из столбца который находится левее на 3 столбца от нужного.
 
Александр, как минимум, можно так (второй слева от нужного):
Код
    x = List.PositionOf(Table.ColumnNames(tbl),"НужныйСтолбец"),
    addClmn = Table.AddColumn(tbl,"НовыйСтолбец", each Record.FieldValues(_){x-2})
 
Спасибо, очень похоже на то, что я ищу. Я, правда, еще не силен в PQ, и, насколько понимаю, вместо (tbl) должно быть указано имя нужной мне таблицы. А нельзя ли заставить PQ воспринимать в качестве таблицы то, что я вижу во время предварительного просмотра, чтобы не выгружать лишний раз не нужные мне данные. То есть вписать данный код прямо между шагами существующего запроса, а PQ при этом воспринимал таблицей то, что окажется выше этих строчек кода?
 
Александр, вместо tbl должно быть имя переменной (шага), содержащей нужную таблицу. В созданном мной примере эта переменная называется tbl:
Код
let
    tbl = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    x = List.PositionOf(Table.ColumnNames(tbl),"НужныйСтолбец"),
    addClmn = Table.AddColumn(tbl,"НовыйСтолбец", each Record.FieldValues(_){x-2})
in
    addClmn
 
Александр, еще вариант. Столбец слева от известного. Первой цифрой регулируем номер столбца от искомого( 1=первый слева от искомого, 2=второй слева от искомого). Второй цифрой выбираем сколько столбцов оставить
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Custom1 = List.LastN(List.RemoveLastN(List.RemoveLastN(Table.ColumnNames(Source), each _<>"Известный"),1), 1),
    Custom2 = Table.SelectColumns(Source,Custom1)
in
    Custom2
Изменено: Михаил Л - 16.09.2021 19:03:18
 
Извиняюсь, туплю. Поставил просто вместо таблицы предыдущий шаг. Все работает. Огромное спасибо за помощь

Михаил Л, попробовал и Ваш способ, тоже очень полезная штука, обязательно внедрю). Спасибо большое.
Изменено: vikttur - 16.09.2021 20:48:53
 
Добрый день, форумчанам.
Вопрос как у автора темы, только решение нужно немного иное.
Есть номер столбца по которому нужно отфильтровать <> null.

Можно как то выбрать столбец не по названию, а по его номеру?

Пример таблицы прикладываю.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Primer"]}[Content],
    #"Строки с примененным фильтром" = Table.SelectRows(Source, each ([Column5] <> "null"))
in
    #"Строки с примененным фильтром"
 
Shady,
Код
  filter = Table.SelectRows ( Source, each Record.FieldValues ( _ ){Number.From ( Запрос1 ) - 1} <> "null" )
 
Спасибо за ответ, все заработало. Пробовал я этот вариант, но почему то выдавал ошибку, на стадии попытки в фигурные скобки просто цифру столбца добавить.
Видимо, где то, что то упускал.  
Страницы: 1
Наверх