Подскажите, есть ли возможность сразу создать, например, три (или заданное кол-во) дубликата столбца? Достаточно часто мне приходится раскладывать дату на год, день, неделю и т.д. Сейчас для этого я каждый раз создаю дубликат столбца, а затем извлекаю нужное.
Интересно, можно ли осуществить операцию дублирования как-то более оптимально?
Код
let
Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
#"Измененный тип" = Table.TransformColumnTypes(Источник,{{"фио", type text}, {"отдел", type text}, {"сумма", Int64.Type}, {"Дата", type datetime}}),
#"Дублированный столбец" = Table.DuplicateColumn(#"Измененный тип", "Дата", "Копия Дата"),
#"Дублированный столбец1" = Table.DuplicateColumn(#"Дублированный столбец", "Дата", "Копия Дата.1"),
#"Дублированный столбец2" = Table.DuplicateColumn(#"Дублированный столбец1", "Дата", "Копия Дата.2"),
#"Извлеченный год" = Table.TransformColumns(#"Дублированный столбец2",{{"Копия Дата", Date.Year, Int64.Type}}),
#"Извлеченное название месяца" = Table.TransformColumns(#"Извлеченный год", {{"Копия Дата.1", each Date.MonthName(_), type text}}),
#"Вычисленная неделя года" = Table.TransformColumns(#"Извлеченное название месяца",{{"Копия Дата.2", Date.WeekOfYear, Int64.Type}})
in
#"Вычисленная неделя года"
Это, кстати, не просто. Там менюшки очень сильно контекстозависимые от того сколько и какого типа столбцов выделено в момент нажатия на ПКМ или при выборе ленты. Даже вкладки новые в ленте появляются внезапно!
Андрей VG,Я, конечно, оценил Вашу иронию. Но почему Вы всегда рассматриваете подобные вопросы через призму того, что человек ничего не хочет сам изучать, а лишь получить готовое решение и все? Изучал я меню, да, про этот пункт не знал, что здесь зазорного, если я на форуме спрашиваю о том функционале, которого не знаю. Не в силу лени и нежелания изучения инструмента, а потому, что просто вот не знал об этой возможности.
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
Dyroff написал: а потому, что просто вот не знал об этой возможности.
Я тоже не знаю о такой возможности, вы не поверите Но! Известно, что есть добавление столбца. Чтобы получить номер месяца из даты, можно предположить, что есть такая функция. Следовательно достаточно заглянуть в справочник, чтобы её взять и применить. Но по международной статистике 70-80% людей не читают подобные вещи, а
Цитата
Dyroff написал: спрашиваю о том функционале, которого не знаю.
Андрей VG написал: Я тоже не знаю о такой возможности, вы не поверите
Вот тут Вы правы:), я не могу в это поверить. Не всегда стоить всех мерить по себе. У Вас, очевидно, огромный опыт и багаж знаний в области работы с данными,Вы знаете и VBA и SQl, и DAX, да и кучу всего, о чем я даже не подозреваю. Все эти знания и их применение и владение информацией, безусловно накладывают определенный отпечаток на работу вашего мышления и построение причинно следственных связей. Для Вас это очевидные вещи, ну просто в силу того, что мозг у Вас так работает. Но блин, поверьте, очень много людей, у которых не сработает эта цепочка так быстро, а у некоторых и не сработает вообще) Так что из этих 70-80% людей, конечно, есть и те, которые просто и не хотят вникать, но есть и другие, которые только осваивают этот путь и не наработали еще того опыта, который им позволит быстро вычленять то, что нужно и быстро находить ответ.
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
Dyroff, Вот согласен с вашими доводами, но какая разница в целом, когда ответ на вопрос получен Все мы разные, со своими тараканами. А Андрей VG, большое спасибо за то, что тратит свое время на таких как мы
В жизни нет ничего невозможного! Есть только недостаток знаний и умений.
Александр, да и я тоже очень благодарен Андрею за его помощь. Просто я вижу что Андрей часто судит о ситуации со своего уровня, уровня человека, для которого даже если он не знает ответ- найти нужный справочник, правильно сформулировать вопрос и найти решение (с имеющимися то знаниями) не составляет труда. Но к сожалению, не все, кто задают тут вопросы могут так же, иначе и вопросы то не задавали:)
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
Коллеги, в защиту Андрея ( в которой он, правда, не нуждается) имею сказать, что изучение интерфейса программы чтения справочников не требует. Сиди да гляди какие есть кнопки, и какие всплывают подсказки. Единственно что, если какие-то кнопки неактивны, то тут да, или в справочник, или сюда имеет смысл задать вопрос. Лично мне хватило 3-4 часов чтобы протыкать всевозможные комбинации и понять возможности кнопочного подхода. На текущий момент работаю в режиме "натыкал в кнопки, подправил формулы, получил результат". Но тут уже от справочника не отрываешься и спецификации языка знать не помешает. Правда в PBI стало уже значительно проще, после добавления в расширенный редактор Intellisense.
Если я правильно понял ваш вопрос, он заключается в том как выполнить некое действие на языке М (PowerQuery) некоторое количество раз.
Это фунцкиональный язык и в нем нет привычных циклов, но ваша задача может быть решена следующими путями:
- Использование рекурсивной функции (которая вызывает саму себя и на каждом шаге добавляет в таблицу столбец) - Использование в качестве тягловой силы для создания функции List.Generate - на каждом шаге создаваемого списка у вас будет таблица с новым столбцом, а в итоге вы берете последний элемент из списка (на M элементами всех "массивов" может быть что угодно - например, таблица, функция или даже тип данных).
Но конкретно в вашем случае (простое преобразование) и малое число шагов, проще просто расклонировать строки.
Пример с итеративной функцией (пишу без проверки в редакторе - надо проверять синтаксис и работу):
Код
AddClones = (
Src as table, // Ваша таблицу, куда добавлять клонов
ColNames as list, // Имя вновь добавляемых столбцов списком (имена должны быть уникальные)
optional _Index as number // Индекс в списке столбцов. При вызове пользователем не используется.
) as table =>
let
Index = if _Index = null then 0 else _Index // Если запущено без аргумента (первый раз) то присваиваем ноль.
in
if Index = List.Count() then
Src
else
Table.DuplicateColumn(@AddClones(Src, ColNames, Index + 1), "Дата", ColNames{Index}),
MyTable = AddClones(#ВашаТаблица, {"Столбец 1", "Столбец 2", "Столбец 3"})