1 | ||||||
Как быстро удалять лишние строки?27.05.2016, 09:41. Показов 11212. Ответов 29
Метки нет (Все метки)
На листе есть структурированные данные: столбцов 40-250 (иногда больше), строк вообще 100 000-140 000 (и очень часто может быть больше).
Я нарисовал функцию, которая выбирает уникальные строки, остальные с листа удаляет командой
Сделать массив и обработать его не представляется возможным: слишком здоровый получается 140 000 строк * 200 столбцов *64 (тип Variant) = 1792 000 000 Вообщем лучше на листе... Может у кого есть идеи - как это ускорить? А то на ночь ставлю - и не факт, что утром будет готово...
0
|
27.05.2016, 09:41 | |
Ответы с готовыми решениями:
29
Удалять лишние пробелы в поле ввода информации на лету Подскажите почему не работает?Она должна удалять лишние пробелы в файле в любой строке. Как удалять элемент из строки в c++? Исправьте пожалуйста,прога должна,удалять лишние пробелы в файле,вместо этого удаляет все содержимое? |
Модератор
|
|
27.05.2016, 09:49 | 2 |
удалять надо от последней записи к первой
а как написан ваш макрос
1
|
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
|
||||||
27.05.2016, 10:13 | 3 | |||||
Для удаления строк есть быстрый код от ZVI - только вот что-то найти не могу...
Идея в том, чтоб проставить единички в массив, выгрузить рядом с данными, отсортировать, удалить сразу всё одним блоком. Добавлено через 2 минуты Нашёл:
Кстати там в той оригинальной теме я что-то с словарями писал - может там сразу и удаление неуникальных было, детали естественно не помню... А не, там задача была "удалить все строки в 7 столбце, значение которых не равно 2 или 3" - но думаю можно приспособить для анализа уникальности. Если конечно под Виндовс работаете.
2
|
4 / 4 / 3
Регистрация: 19.08.2013
Сообщений: 24
|
|
27.05.2016, 11:10 | 5 |
Hugo121, спасибо за код, сохраню к себе в памятку. вообще когда появляется необходимость в ручную удалить много строк из еще большего количества(до миллиона) я сначала фильтром выделяю то, что хочу удалить, после последнего столбца ставлю везде 1. делаю по нему сортировку и удаляю.
1
|
27.05.2016, 11:30 [ТС] | 6 |
shanemac51, спасибо за совет. А можно немножко пояснить - почему именно так?
Hugo121, меня немного смутило то, что на SQL -ресурсе опубликовано... но если написано для Excel - то в принципе надо пробовать... Сейчас прога работает - я чуть позже покопаюсь в коде. Хотя уже сейчас есть вопрос - сортировка... Что обеспечивается командой Sort? Вообще у меня каждая строка, намеченная на удаление, помечена словом "дубликат". Понимаю. что расточительство. но через время - понимать и код и содержимое листа проще. По идее, есть возможность отфильтровать строки с этой меткой одним движением. Думаю, лучше будет выделить строки через Union Добавлено через 2 минуты mitsakoolt, спасибо... стало понятно зачем сортировка тут... Хотя если несмежные диапазоны выделены - неужели нет способа их удалить без сортировки?
0
|
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
|
|
27.05.2016, 11:35 | 7 |
Через union дольше, но тоже вариант.
Как раз вчера такое делал (вернее гонял ранее написанное) - само объединение делает за пару секунд, но вот затем удаление происходит раз так в 10 дольше. А если удалять построчно - то нужно снизу вверх потому что каждая удалённая строка как ни странно удаляется Т.е. пропадает и на её место сдвигается строка снизу, которую возможно тоже нужно бы удалить...
0
|
27.05.2016, 11:45 | 9 | |||||
Мой не подходит по ссылке? исходник (без правки)
0
|
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
|
|
27.05.2016, 11:52 | 10 |
bedvit, тоже можно, но для количества в сотни тысяч строк как минимум перебирать и анализировать нужно бы данные массива - тут у Вас на каждую строку идёт два обращения к листу, что в 43*2 раза дольше, чем обращение к массиву.
Да и если всё брать в юнион - то не важно с какого конца перебирать, можно и сверху вниз.
0
|
27.05.2016, 12:48 | 12 | |||||
Hugo121, в общем согласен с вами. Выделение 1 млн. строк с поиском по условию 11 сек., это много, но по сравнению с операцией удаления
, копейки. Плюс Union - медленная функция. Если вам будет интересно здесь максимальной производительности для Union (выделение 250 тыс. несвязных ячеек за 5 сек.)
Добавлено через 23 минуты Поиск по условию через массив (0,078125 сек.), при отключенном Union. Теперь только вопрос в Union, и самой операции удаления.
С двумя условиями 0,16796875 сек.
0
|
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
|
||||||
27.05.2016, 12:49 | 13 | |||||
0
|
4 / 4 / 3
Регистрация: 19.08.2013
Сообщений: 24
|
||||||
27.05.2016, 12:53 | 14 | |||||
удалить можно, но процесс будет очень долгим. я первый раз с вечера поставил удалять, утром вернулся и удаление еще продолжалось. тогда было около 700 000 строк, из них почти половину нужно было удалить. и диапазоны в среднем были по 1-3 строки. при сортировке когда удаляешь одним диапазоном все происходит за секунды. хотя через макрос наверно будет также и без сортировке если ввести
0
|
27.05.2016, 13:04 | 15 |
Но Union нужен, когда строки нельзя сортировать, когда их много и когда их нужно удалить разом (что быстрее чем по одной или по несколько за раз)
Добавлено через 4 минуты Hugo121, согласен. Можно да же удалить второе условие, ТС возможно нужно только одно условие. думаю отключение экрана и перерасчет сильно не поможет в моем коде, там и так разом все делается (удаление). Добавлено через 3 минуты Каждое условие это 0,08 сек., копейки-копеек по сравнению с другими расчетами)
0
|
Модератор
|
|
27.05.2016, 14:30 | 16 |
0
|
28.05.2016, 15:16 [ТС] | 17 | ||||||||||
Ребята. Очень извиняюсь... Сейчас готовлюсь исчезнуть дней на 40... Поэтому работаю с Вашими рекомендациями очень нерегулярно... и отвечаю тоже... Тренируюсь на левшу. Экстренно))) Ибо чую - очень надо это мне на лето.
Галина. Форматирование и формулы в массив не гружу. Гружу командой
Добавлено через 1 минуту Выгружаю из массива уже обработанные данные аналогично Собственно здесь потери времени минимальны Добавлено через 1 час 1 минуту Вот что у меня получилось
0
|
Модератор
|
||||||
28.05.2016, 17:11 | 18 | |||||
1
|
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
|
||||||
28.05.2016, 23:38 | 19 | |||||
Я думаю быстрее будет в union брать не всю строку, а только одну ячейку строки.
А в конце удалять
1
|
29.05.2016, 18:36 | 20 |
Hugo121, хорошая идея. Сегодня протестировал немного. Если строк много (на удаление) несколько десятков тысяч, Union работает медленно и удаление не столь быстрое как хотелось.
AndreA SN, сортировка в условиях задачи разрешается? Формул, условного форматирование нет? Порядок следования строк сохранятся должен?
0
|
29.05.2016, 18:36 | |
29.05.2016, 18:36 | |
Помогаю со студенческими работами здесь
20
Как удалять строки по найденному слову? Как с массива удалять столбцы или строки? Объясните как удалять, добавлять и сортировать строки Объясните, как удалять строки из текстового файла? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |