Страницы: 1
RSS
Как в Power Query к данным добавить префикс
 
Здравствуйте, уважаемые знатоки Excel! Пытаюсь решить следующую задачу. Необходимо всем данным во всех столбцах добавить префикс, который равен названию столбца. Как добавлять одинаковый префикс всем столбцам я разобрался, а вот чтобы имя столбца, что-то не выходит. В приложенном файле, для понимания просто созданы две таблицы без запросов- источник и какой результат хотелось бы увидеть.
 
Вот такой вариант:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Заголовки = List.Buffer( Table.ColumnNames(Источник) ),
    КоличествоСтолбцов = List.Count(Заголовки),
    ВсеВТекст = Table.TransformColumnTypes(Источник,{{"Index", type text}, {"Data", type text}, {"Cat", type text}}),
    ДобавленныйПрефикс = (t,i) => 
        if i <= КоличествоСтолбцов - 1
            then @ДобавленныйПрефикс( Table.TransformColumns( t, {{Заголовки{i}, each Заголовки{i} & " = " & _, type text}}), i + 1)
            else t,
    Итог = ДобавленныйПрефикс(ВсеВТекст, 0)
in
    Итог
Изменено: PooHkrd - 28.03.2019 13:31:49
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
Вот такой вариант:
Это отличный вариант, всё работает как надо. Благодарю!
 
Но я бы все таки предложил поменять тему на
Power Query. Добавление разных префиксов во все столбцы таблицы. ИМХО оно лучше описывает вашу задачу.
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
Но я бы все таки предложил поменять тему на
Я не против. Я могу это сделать сам, или это должен сделать администратор?  
 
Machestro, модератор поменяет если заглянет и посчитает нужным.
Вот горшок пустой, он предмет простой...
 
PooHkrd, чуть подправил ваш код, чтобы запрос не зависел от количества столбцов и их названия.
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Заголовки = Table.ColumnNames(Источник),
    ВсеВТекст = Table.TransformColumnTypes(Источник,List.Transform(Заголовки, each {_, type text})),
    ДобавленныйПрефикс = (t,i) => 
        if i <= List.Count(Заголовки) - 1
            then @ДобавленныйПрефикс( Table.TransformColumns( t, {{Заголовки{i}, each Заголовки{i} & " = " & _, type text}}), i + 1)
            else t,
    Итог = ДобавленныйПрефикс(ВсеВТекст, 0)
in
    Итог
 
Machestro, или так:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Заголовки = List.Buffer( Table.ColumnNames(Источник) ),
    КоличествоСтолбцов = List.Count(Заголовки),
    ДобавленныйПрефикс = (t,i) => 
        if i <= КоличествоСтолбцов - 1
            then @ДобавленныйПрефикс( Table.TransformColumns( t, {{Заголовки{i}, each Заголовки{i} & " = " & Text.From(_), type text}}), i + 1)
            else t,
    Итог = ДобавленныйПрефикс(Источник, 0)
in
    Итог

List.Buffer и шаг КоличествоСтолбцов добавлены для оптимизации скорости. Если массивы большие, то это может сильно ускорить процесс. Все таки рекурсия совместно с ленивыми вычислениями PQ может подложить вам большую свинью в плане быстродействия.
Изменено: PooHkrd - 28.03.2019 14:01:56
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
List.Buffer и шаг КоличествоСтолбцов добавлены для оптимизации скорости
Оно как. О таких тонкостях я не знал!
 
Machestro, ради эксперимента можете попробовать запустить ваш код и мой, но чтобы в качестве источника была не таблица, а внешний по отношению к книге файл с десятком столбцов и количеством строк тысяч на 100. Прямо даже интересно. А то может я и перестраховываюсь.
Вот горшок пустой, он предмет простой...
 
Проверил с 1000000 строк. Разница если и  есть, то незначительная. Делал все на глаз без макросов. Ваш код, вроде чуть быстрее
Изменено: Machestro - 28.03.2019 14:25:45
 
Доброе время суток.
Коллеги, а зачем рекурсия в данном случае? Чем плохо так
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    transformList = List.Transform(Table.ColumnNames(Source), (name) => {name, (item) => name & "=" & Text.From(item), type text}),
    return = Table.TransformColumns(Source, transformList)
in
    return

или так?
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    nameList = List.Transform(Table.ColumnNames(Source), each {_, _ & "="}),
    return = List.Accumulate(nameList, Source, (nextTable, name) => Table.TransformColumns(nextTable, {name{0}, each name{1} & Text.From(_), Text.Type}))
in
    return
 
Андрей VG, Ваше решение выглядит очень лаконично, что хорошо. Однако если удалить из исходной таблицы некоторые столбцы, то на их месте в запросе появится пустые столбцы Столбец1 , Столбец2...
 
Цитата
Machestro написал:
появится пустые столбцы Столбец1 , Столбец2...
Хотя сейчас проверил, предыдущие решения, то происходит тоже самое. Оказывается так происходит на версии Excel 2016, а вчера всё тестировал на версии 2019
Изменено: Machestro - 29.03.2019 06:00:40
 
Нашёл причину. Нужно было в свойствах самой умной таблицы поставить галочку "сохранять сведения о сортировке...". После этого стало работать как надо
 
Цитата
Андрей VG написал:
а зачем рекурсия в данном случае?
Ну как зачем? Дошел как этим инструментом пользоваться, а, как известно, если у  тебя в руках молоток, то все вокруг кажется гвоздем!  :D Вот и лезу все задачи решать этим молотком. Ваш вариант решения как-то пытался применить пару месяцев назад, но что-то там у меня с синтаксисом не срослось.
Большое спасибо за пример. Тоже буду применять.
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх