bedvit, да, сортировать можно. Да, все верно.
Удаление дубликатов Collection vs. Dictionary
27.11.2017 18:08:26
|
|
|
|
28.11.2017 13:15:16
Пока самый быстрый способ это
Но это через Лист/Range Excel со своими издержками. Можно написать свою библиотеку, думаю будет быстрее
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
|
28.11.2017 14:05:59
bedvit, спасибо за пример.
Но этот способ нельзя использовать если количество уникальных значений больше строк в Excel. |
|
|
|
28.11.2017 14:13:33
В schema.ini указал тип Memo, для ImportMixedTypes установил значение Majority Type, TypeGuessRows установил на 0, добавил IMEX=2, подключил Microsoft ActiveX Data Objects 6.1, но тщетно - все текстовые значения урезаются до 255 символов |
|||
|
|
28.11.2017 14:17:06
Делайте по моему описанию - медленно, сердито, но надёжно
Да не так и медленно.. |
|
|
|
28.11.2017 15:52:57
Hugo, пишет хороший вариант, сделайте загрузку файла CSV, обработку повторов в строках и выгрузку в файл CSV в одном блоке команд. Вы же загружаете и выгружаете CSV построчно?
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
|
28.11.2017 16:01:37
Я чуть иначе предлагал - читаем и пишем файлы сразу параллельно построчно. Причём читать можно кучей сразу все, а писать в один.
|
|
|
|
28.11.2017 16:18:16
Hugo, в связи с тем что файл будет один (насколько я понял), ваша мысль идентична моей фразе (писать из начального файла в конечный построчно, проверяя строки на уникальность)
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
|
28.11.2017 16:51:06
|
|||
|
|
28.11.2017 17:11:44
А зачем столько памяти? Если построчно читать...
А какие ключи нужно будет хранить в словаре/коллекции - об этом пока никто не говорил. |
|
|
|
28.11.2017 17:15:58
|
|||
|
|
28.11.2017 17:28:25
Почитал про уникальность хэшей...
|
|
|
|
28.11.2017 17:44:10
|
|||
|
|
28.11.2017 18:54:23
AB1, а ваша программа не умеет группировать данные при выгрузке в файл CSV? (Обычный функционал для среднего уровня программы). Или хотя бы сортировать перед выгрузкой. Будет значительно проще удалять дубликаты, не нужно будет словарей, коллекций и 2,4 Гбайта данных
А какими инструментами вы сейчас это перелапачиваете?
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
|
28.11.2017 19:37:12
Нашел в чем загвоздка с ADO - если считывать данные без GROUP BY, то строки (>255) не укорачиваются, а если использовать GROUP BY, то происходит лимитирование
|
|
|
|
28.11.2017 19:38:47
|
|||
|
|
28.11.2017 19:50:25
Изменено: |
|||
|
|
28.11.2017 20:25:46
Я с хэшем только раз дело имел в одном проекте, там не особо критична была уникальность, обходился MD5. У меня даже и кодов других нет...
Нет кстати к слову готового проверенного кода sha512 на VBA в копилку? P.S. Сам нашёл - правда строка Hello World распухает в LHT9F+2v2A6ER7DUZ0HuJDt+t03SFJoKsbkkb7MDgvJ+hT2FhXGeDmfL2g2q хотя ничего, любая строка смотрю на выходе даёт 88 символов... или массив в 64 элемента.
Изменено: |
|||
|
|
28.11.2017 20:37:07
AB1, а можно глянуть на структуру .CSV входящей и исходящей для образца?
Я б сгенерил массив входящий в нужный CSV, и результат кусками сливать можно, а то все в памяти висит и время не на обработку на генерацию жалко... А то 144/2000000=24сек.(MSO2013x32)/=20сек.(MSO2016x64). А у меня памяти всего 4Гб. Хотел 300/3000000, а он послал меня на ... out of memory
Изменено: |
|
|
|
28.11.2017 22:02:24
В CSV-файле один столбец, данные по структуре близки тем, которые я привел в примере -
|
|
|
|
29.11.2017 09:59:55
|
|||
|
|
29.11.2017 10:10:26
Так и ладно - если вываливать массив в строку с разделителями - это ещё больше в любом случае будет.
А если напрягает потеря времени на отдельной функции - можно преобразование интегрировать в макрос. |
|
|
|
29.11.2017 11:37:40
Всем - привет!
VBA вполне годится для такой задачи. Все дело в алгоритме. Код, приведенный ниже, из данных листа быстро создаст в папке ThisWorkbook.Path & "\OutFiles" текстовые файлы, в каждом из которых будут уникальные строки одинаковой длины. Кодом нужно обработать поочередно все исходные данные, а затем данные из созданных текстовых файлов (предварительно переместив эти файлы в другую папку). Результирующие текстовые файлы уникальных данных при желании можно объединить в один файл, но это уже несложно. Затраты времени можно увидеть в окне Immediate при Const IsLog As Boolean = True
Изменено: |
|||
|
|
29.11.2017 12:11:23
Могу попробовать написать библу которая будет из .CSV делать .CSV с удалением дубликатов. Для этого нужно знать:1.
А лучше файл пример (входящий, исходящий-если он отличается разделителями и кодировкой).
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
|
29.11.2017 12:58:13
1. Сортировать не нужно.
2. Разделитель текста - двойные кавычки:
3. ANSI.
Изменено: |
|||
|
|
29.11.2017 13:04:25
Если не вводить заголовки, у вас же исходно их не было, то можно таким вариантом на Power shell сделать.
Скорость несколько похуже - два тестовых файла по 500000 строк сшивались 4,5 минуты. |
|||
|
|
29.11.2017 13:06:42
Пока получилось следующее:
Информация считывается в 2 этапа - один для строк < 256, второй - для строк > 256. Строки менее 256 символов считываются ADO, дубликаты удаляются тоже ADO. Строки более 255 символов считываются ADO, дубликаты удаляются в коллекции. С хешами пока не экспериментировал.
Изменено: |
|||||
|
|
29.11.2017 13:10:22
ZVI, благодарю за макрос.
Андрей VG, спасибо за вариант с Power shell, попробую. |
|
|
|
29.11.2017 13:28:37
Изменено: |
||||
|
|
|||