Добрый день! Есть массив данных числовых (1 млн строк, 8 столбцов), каждый столбец может иметь разное количество строк. Помогите пожалуйста отобрать уникальные значения и вывести их в столбцы, с учетом максимального количества строк одного из столбцов. Пример во вложении.
Макрос для отбора уникальных значений из ОГРОМНОГО массива, Нужны только уникальные значения
26.09.2018 21:42:23
|
|
|
|
26.09.2018 21:57:49
В частности, от гигов памяти и разрядности системы. В любом случае все через словари или коллекции. (Словарь мне нравится больше для таких случаев.) |
|||
|
|
26.09.2018 22:00:22
в сторонке желательно, чтобы посмотреть сколько элементов было, сколько стало
Михаил С., техника позволяет, 32 Гб оперативной 64 бита, офис 2017. Наведите на мысль, как млжно словари прикрутить, если диапазоны в разных столбцах? |
|
|
|
26.09.2018 22:08:10
Ну и теперь остается их как-то с условием оттуда вытищить, чтобы не повторялись, верно? В этом-то у меня проблема и есть - каким условием можно отловить уникальные значения?
|
|
|
|
26.09.2018 22:09:29
|
|||
|
|
26.09.2018 22:12:39
Михаил С., звучит здорово и вроде даже просто )
|
|
|
|
26.09.2018 22:14:44
|
|||
|
|
26.09.2018 22:17:45
Юрий М, пардон, 2016
|
|
|
|
26.09.2018 22:18:17
Не приставай. bss17, значит, и Офис сооветствующий )
|
|
|
|
26.09.2018 22:24:31
Интересно, а через SQL и SELECT DISTINCT и UNION список уникальных из столбцов собрать и потом уже заниматься выводом?
По вопросам из тем форума, личку не читаю.
|
|
|
|
26.09.2018 22:31:49
Особенно если данных много, или usedrange юзер создал на весь лист, или офис х32 - это пока никто не уточнял... Но в общем пофиг, можно в массив брать по столбцу, сразу и определить максимальную длину, а собирать всё в коллекцию, а оттуда перегрузить в созданный под нужный размер массив (если памяти конечно хватит, а если нет - то в массивы), и это в финале выгрузить в новую книгу/лист/куда угодно. |
|||
|
|
26.09.2018 22:36:08
|
|
|
|
26.09.2018 22:37:12
Зависит от количества уникальных. Например, на моем компе 500 000 уникальных - 4.5 сек; 1 000 000 - 20 сек. как-то так.
Изменено: |
|||||
|
|
26.09.2018 22:38:15
начитался советов и вот результат
bss17, а "уникальные" - это единственные (неповторимые), т.е. те, что встречаются только 1 раз, а я собрал список всех значений без повторов.
Изменено:
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
|
|
|
|
26.09.2018 22:38:44
|
|
|
|
26.09.2018 22:45:41
Лень искать есть ли Эксель 2016 х32, но у меня работает х32 Эксель2010, хотя система х64
Изменено: |
|
|
|
26.09.2018 22:45:59
|
|
|
|
26.09.2018 22:48:11
|
|||
|
|
26.09.2018 22:48:14
Автор выше (#10) сообщил, что он опечатался: 2017 вместо 2016, но медведь из-за своей самокрутки этого не видит )
|
|
|
|
26.09.2018 22:52:17
|
|||
|
|
26.09.2018 22:54:56
|
|
|
|
26.09.2018 23:05:17
Доброе время суто
Если уникальных больше миллиона, то лучше делать на коллекциях - быстрее будет. P. S. Странно, Виталий был на форуме, но что-то не стал на С++ делать - наверняка через сортировку отбор уникальных был бы секунд за 10.
Изменено: |
|||||
|
|
26.09.2018 23:13:20
|
|||
|
|
27.09.2018 07:45:46
Андрей VG, Андрей, интересно сравнить на том же мега быстром нетбуке и данных вариант Ігор Гончаренко,
Off
Или все ж кипела не вода? :-)
Изменено:
По вопросам из тем форума, личку не читаю.
|
|||||||
|
|
27.09.2018 08:52:36
Всем привет!
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
|
27.09.2018 09:32:43
bss17, а реальные данные - это в самом деле целые числа в определенном интервале? Или нецелые, но с ограниченным числом знаков после запятой?
Я к чему - можно объявить массив типа Integer или Byte, в примере 0 To 90000, и для каждого исходного числа класть 1 в соотв. эл-т массива. А потом выбрать те эл-ты, которые равны 1. Это должно быть быстро.
Изменено: |
|
|
|
27.09.2018 10:06:14
Лобовая вчерашняя версия на SQL отработала за 237 секунд. На словаре не дождался, убил Excel после 15 минут работы. На коллекции отработал за 85 секунд.
Быстрее всего получилась версия на SQL с переброской данных в текстовый файл и определением schema.ini – отработало за 35 секунд.
Тестовый пример простой. На Лист1 в первой строке пишем f1..f8 В диапазон A2:H1000001 формула =СЛУЧМЕЖДУ(0;8000000), потом копирование и вставка значений. Выводом на лист массива уникальных с разбивкой по столбцам – не интересовался, по идее это достаточно быстро и тривиально. |
|||||||||||
|
|
||||||||||