Страницы: 1
RSS
PQ. Поиск строки заголовков по вх. параметру.
 
Добрый день.
Как можно добавить таблицу в PQ, зная только название столбцов, но не зная номера столбца и строки?
В тестовой таблице нужно добавить таблицу со столбцами "Найди меня" и "Добавь меня" по ключевому столбцу "Найди меня".
 
Доброе время суток.
Вариант.
Код
let
    getKeyWordPositions = (where as table, keyWord as any) as list =>
    let
        base = List.Zip({Table.ColumnNames(where), Table.ToColumns(where)}),
        search = List.Transform(base, (item) => [column= item{0}, rowId= List.PositionOf(item{1}, keyWord, Occurrence.First)])
    in
        List.Select(search, each _[rowId] > -1),
    Sourse = Excel.CurrentWorkbook(){[Name="Лист1"]}[Content],
    keyWordPositions = getKeyWordPositions(Sourse, "Найди меня"),
    result = if List.Count(keyWordPositions) > 0 then Table.FromRecords(keyWordPositions) else null
in
    result
Изменено: Андрей VG - 06.08.2020 18:56:24
 
Доброго времени суток
я как-то так понял
Код
let
    Source   = Excel.CurrentWorkbook(){[Name="Лист1"]}[Content],    
    fn       = (tbl,col1,col2)=> let 
                   SkipRows   = Table.Skip(tbl,each not List.Contains(Record.ToList(_),col1)),
                   SkipCols   = List.Skip(Table.ToColumns(SkipRows),each _{0}<>col1),
                   RemoveCols = List.RemoveLastN(SkipCols,each _{0}<>col2)
               in Table.FromColumns(RemoveCols),
    Promoted = Table.PromoteHeaders(fn(Source,"Найди меня","Добавь меня"), [PromoteAllScalars=true])
in
    Promoted
 
Андрей Лящук, Спасибо большое, на выходе то что хотел! )
Андрей VG, и Вам спасибо! Пока ничего не понятно, но выглядит здорово, пошел разбираться)

P.S. Прошу прощения за тестовый файл, делал впопыхах.
Изменено: TankSpb - 06.08.2020 21:20:46
 
Цитата
TankSpb написал:
я как-то так понял
Тёзка, а так не проще?
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Лист1"]}[Content],
    base = Source,
    getSubTable = (base as table, keyWords as list) as table =>
    let
        keyWordsLength = List.Count(keyWords),
        skipedRows = Table.Skip(base, each not (List.Count(List.Intersect({Record.FieldValues(_), keyWords})) = keyWordsLength)),
        setHeader = Table.PromoteHeaders(skipedRows, [PromoteAllScalars=true])
    in
        Table.SelectColumns(setHeader, keyWords),
    result = getSubTable(Source, {"Добавь меня", "Найди меня"})
    
in
    result

Updated
Не удержался протестировал. Создал таблицу на 15 столбцов без одной строки на предельное количество. Искомые названия столбцов нужной подтаблицы разместил в строке 900000 в 7 и 8 столбцах, ниже них данные формулы СТРОКА(). Код Андрея отработал за 31 секунду, мой за 8 секунд.
Цитата
TankSpb написал:
на выходе то что хотел! )
А почему бы тогда и не дать теме такое название, чтобы было сразу понятно, что вы хотите :qstn:  :excl:
Изменено: Андрей VG - 06.08.2020 22:33:00
 
Цитата
Андрей VG написал:
а так не проще
ну да, дергать туда-сюда всю таблицу, чтобы отсеять ненужные столбцы - не лучшая идея.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Лист1"]}[Content],    
    fn     = (tbl,col1,col2)=> let 
                 SkipRows   = Table.Skip(tbl,each not List.Contains(Record.ToList(_),"Найди меня")),
                 Promoted   = Table.PromoteHeaders(SkipRows, [PromoteAllScalars=true]),
                 ColNames   = Table.ColumnNames(Promoted),
                 NeededCols = List.RemoveLastN(List.Skip(ColNames,each _<>col1),each _<>col2)
             in Table.SelectColumns(Promoted,NeededCols),
    Result  = fn(Source,"Найди меня","Добавь меня")
in
    Result
 
Цитата
Андрей VG написал:
А почему бы тогда и не дать теме такое название, чтобы было сразу понятно, что вы хотите  
Еще раз прошу прощения, делал на скорую руку. Задача стандартная, есть выгрузки из учетной системы, но разные пользователи по своему располагают столбцы + возможен сдвиг по строкам в зависимости от параметров выгрузки. При этом на выходе должен быть реестр с данными из необходимых столбцов.
Страницы: 1
Наверх