Страницы: 1
RSS
Power Query функция List.Generate, Код выдает ошибку Expression.Error: Неизвестный идентификатор. Использовалось ли условное обозначение [field] для _[field] вне выражения "each"?
 
Добрый день.
С помощью PQ импортирую файл *csv. Это прогноз выступления игроков в Fantasy Premier League. В запросе переименовываю столбцы. Прогноз выдается на 8 туров. И всё хорошо, пока до конца чемпионата 8 или более туров. Если туров остается меньше, то и столбцов меньше. Пробую с помощью двух функций List.Generate создать списки внутри Table.RemoveColumns в зависимости от числа оставшихся туров. Получаю ошибку
Expression.Error: Неизвестный идентификатор. Использовалось ли условное обозначение [field] для _[field] вне выражения "each"?
Предполагаю, что как-то неверно обращаюсь с Index: PQ ожидает одно значение, а получает весь столбец [Index]. Или ошибка в коде где-то еще.
Может быть, в принципе предложите иной подход.
Спасибо.
Код
let
    fullfilepath = fnGetParameter("File Path fplreview"),
    tour1 = fnGetParameter("tour"),
    tour_max = if tour1 <= 31 then 7 else 38 - tour1,
    Источник = Csv.Document(File.Contents(fullfilepath),[Delimiter=",", Columns=22, Encoding=65001, QuoteStyle=QuoteStyle.None]),
    #"Повышенные заголовки" = Table.PromoteHeaders(Источник, [PromoteAllScalars=true]),
    #"Удаленные столбцы" = Table.RemoveColumns(#"Повышенные заголовки",{"SV", "ID"}),
    #"Переименованные столбцы" = Table.RenameColumns(
        #"Удаленные столбцы",
        {   {"BV", "Cost"},
            List.Generate(
                ()=> [Index=0],
                each [Index] <= tour_max,
                each [Index = [Index]+1],
                each Table.ColumnNames(#"Удаленные столбцы"){4+[Index]*2},"Min"&Text.From(tour1+[Index])
            ),
            List.Generate(
                ()=> [Index=0],
                each [Index] <= tour_max,
                each [Index = [Index]+1],
                each Table.ColumnNames(#"Удаленные столбцы"){5+[Index]*2},"Pts"&Text.From(tour1+[Index])
            )
        }
    )
in    
    #"Переименованные столбцы"
 
А зачем тут List.Generate?
Покажите в примере вручную что нужно получить на выходе?
Вот горшок пустой, он предмет простой...
 
PooHkrd, тоже утром глянул, не понял зачем :) Не было времени разбираться.
s_bag, если правильно успел заметить, то у Вас фиксированное количество первых столбцов с измерениями и далее переменное число столбцов с данными.
Вариант с ходу - делайте unpivot, меняйте столбец «атрибута» (читай, наименования столбца данных до unpivot) по нужному Вам алгоритму и делайте pivot.
Или вообще не делайте pivot, а далее «нормально» анализируйте данные плоской таблицы :)
 
Цитата
написал:
Покажите в примере вручную что нужно получить на выходе?
Я привел не всю обработку, а только ее часть. Цель этого фрагмента запроса - переименовать столбцы ориентируясь на их номера, а не названия. Так как названия меняются от тура к туру. И пока туров оставалось много, таблица всегда содержала данные о следующих 8 турах. Я использовал такой код:
Код
let
    fullfilepath = fnGetParameter("File Path fplreview"),
    tour1 = fnGetParameter("tour"),
    Источник = Csv.Document(File.Contents(fullfilepath),[Delimiter=",", Columns=22, Encoding=65001, QuoteStyle=QuoteStyle.None]),
    #"Повышенные заголовки" = Table.PromoteHeaders(Источник, [PromoteAllScalars=true]),
    #"Удаленные столбцы" = Table.RemoveColumns(#"Повышенные заголовки",{"SV", "ID"}),
    #"Переименованные столбцы" = Table.RenameColumns(#"Удаленные столбцы",
        {
        {"BV", "Cost"},
        {Table.ColumnNames(#"Удаленные столбцы"){4},"Min"&Text.From(tour1)}, 
        {Table.ColumnNames(#"Удаленные столбцы"){5},"Pts"&Text.From(tour1)},
        {Table.ColumnNames(#"Удаленные столбцы"){6},"Min"&Text.From(tour1+1)}, 
        {Table.ColumnNames(#"Удаленные столбцы"){7},"Pts"&Text.From(tour1+1)},
        {Table.ColumnNames(#"Удаленные столбцы"){8},"Min"&Text.From(tour1+2)},
        {Table.ColumnNames(#"Удаленные столбцы"){9},"Pts"&Text.From(tour1+2)},
        {Table.ColumnNames(#"Удаленные столбцы"){10},"Min"&Text.From(tour1+3)},
        {Table.ColumnNames(#"Удаленные столбцы"){11},"Pts"&Text.From(tour1+3)},
        {Table.ColumnNames(#"Удаленные столбцы"){12},"Min"&Text.From(tour1+4)},
        {Table.ColumnNames(#"Удаленные столбцы"){13},"Pts"&Text.From(tour1+4)},
        {Table.ColumnNames(#"Удаленные столбцы"){14},"Min"&Text.From(tour1+5)},
        {Table.ColumnNames(#"Удаленные столбцы"){15},"Pts"&Text.From(tour1+5)},
        {Table.ColumnNames(#"Удаленные столбцы"){16},"Min"&Text.From(tour1+6)},
        {Table.ColumnNames(#"Удаленные столбцы"){17},"Pts"&Text.From(tour1+6)},
        {Table.ColumnNames(#"Удаленные столбцы"){18},"Min"&Text.From(tour1+7)},
        {Table.ColumnNames(#"Удаленные столбцы"){19},"Pts"&Text.From(tour1+7)}
        }
    )
in
    #"Переименованные столбцы"
Теперь же туров осталось менее 8, и таблица содержит не 16 фиксированных столбцов с данными которые нужно переименовать по позиции, а меньше. Задача - переименовать ровно то число столбцов, которое есть в таблице.
Приложил файл с тем, что есть и что надо получить.
Изменено: s_bag - 07.04.2022 22:12:17
 
Цитата
написал:
s_bag , если правильно успел заметить, то у Вас фиксированное количество первых столбцов с измерениями и далее переменное число столбцов с данными.
Правильно))
Цитата
написал:
Вариант с ходу - делайте unpivot, меняйте столбец «атрибута» (читай, наименования столбца данных до unpivot) по нужному Вам алгоритму и делайте pivot. Или вообще не делайте pivot, а далее «нормально» анализируйте данные плоской таблицы
Я приблизительно так и делал)) Но потом мне надоело мастерить запросы к каждому туру с нуля (а также я в качестве тренировки старался делать запросы всё более интеллектуальными). И я придумал, как сделать запрос, который можно обновить, даже, когда заголовки исходного файла *csv стали другими (показал в предыдущем ответе). А теперь новая беда - с каждым туром будет уменьшаться число столбцов с данными (первые столбцы остаются без изменения). Т.е., мне нужно научиться подсовывать функции Table.RenameColumns списки замен с различным количеством элементов.
Буду благодарен за помощь))
 
s_bag, можно так:
Код
let
  fullfilepath = fnGetParameter ( "File Path fplreview" ),
  tour1 = fnGetParameter ( "tour" ),
  Источник = Csv.Document ( File.Contents ( fullfilepath ), [ Delimiter = ",", Columns = 22, Encoding = 65001, QuoteStyle = QuoteStyle.None ] ),
  #"Повышенные заголовки" = Table.PromoteHeaders ( Источник, [ PromoteAllScalars = true ] ),
  delClmns = Table.RemoveColumns ( #"Повышенные заголовки", { "SV", "ID" } ),
  clmnNames = Table.ColumnNames ( delClmns ),
  count = ( List.Count ( clmnNames ) - 4 ) / 2,
  newClmnNames = List.FirstN ( clmnNames, 4 )
    & List.Accumulate ( { tour1 .. tour1 + count - 1 }, {}, ( s, c ) => s & { "Min" & Text.From ( c ) } & { "Pts" & Text.From ( c ) } ),
  rename = Table.FromColumns ( Table.ToColumns ( delClmns ), newClmnNames )
in
  rename
 
surkenny, Спасибо! Работает!
Изменено: s_bag - 08.04.2022 14:38:49
Страницы: 1
Наверх