Цитата |
---|
Андрей VG написал: Но стал очень медленным. |
Андрей, а можно точнее? Стал 208 сек, а самый первый мой вариант за какое время отрабатывал? Есть одна идейка как ускорить, хочу понять за какую планку бороться?
З.Ы. и еще, сейчас проверил, в последнем варианте у меня кейс с Художниковым поломался
Надо наколдовать что-то правильное.
В общем, наколдовалось вот такое:
Код |
---|
let
Должности = Table.AddColumn(Table.AddColumn(Excel.CurrentWorkbook(){[Name="Должности"]}[Content], "Длина", each Text.Length([Должность])), "НижРегДолж", each Text.Lower([Должность]) ),
Исходник = Table.AddColumn(Excel.CurrentWorkbook(){[Name="Персоны"]}[Content], "НижРегПерс", each Text.Lower([Персона])),
Декарт = Table.Join( Исходник, {}, Должности, {} ),
ФильтруемПоСовпадению = Table.SelectRows(Декарт, each Text.Contains([НижРегПерс], [НижРегДолж])),
Проверочка = Table.AddColumn(ФильтруемПоСовпадению, "Проверка", each Text.AfterDelimiter([Персона], [Должность]), type text),
ФильтруемЛишнее = Table.SelectRows(Проверочка, each ([Проверка] = "")),
Соритруем = try Table.Sort(ФильтруемЛишнее,{{"Персона", Order.Ascending}, {"Длина", Order.Descending}}) otherwise null,
УдаляемДубликаты = Table.Distinct(Соритруем, {"Персона"}),
ДобавляемФИО = Table.AddColumn(УдаляемДубликаты, "ФИО", each Text.Trim( Text.Replace( [Персона], [Должность], "" ) )),
ОставляемНужное = Table.SelectColumns(ДобавляемФИО,{"ФИО", "Должность"})
in
ОставляемНужное |
На нубуке I3 (4 потока) 2,4ГГц + 8 Гб отработало за 80 сек, на серваке ксеон 2.6ГГц 8 потоков + 32 Гб - 54 секунды.
Ваш крайний вариант с List.Generate запустить не смог, внутри функции ругается на нехватку элементов в перечислении. Разбираться не стал, пока не очень я с этими генераторами дружу.
В файле мой запрос зовется Отчет2, ваш крайний Отчет4. Если обновить запрос Персоны, то сгенерится таблица на 300 тыс строк и можно тестировать.
Для себя делаю вывод: копаться в таблицах внутри ячеек это зло - работать с кроссджойном без последующей группировки выходит шустрее, хотя казалось бы строк в обработке такое же количество.