Добрый день!
Подскажите пожалуйста, кто знает, как можно макросом удалить из ячейки все символы, кроме цифр?
Подскажите пожалуйста, кто знает, как можно макросом удалить из ячейки все символы, кроме цифр?
28.05.2019 09:31:21
Добрый день!
Подскажите пожалуйста, кто знает, как можно макросом удалить из ячейки все символы, кроме цифр? |
|
|
|
28.05.2019 09:39:49
Изменено:
|
|||
|
|
28.05.2019 09:40:30
|
|
|
|
28.05.2019 11:31:58
Спасибо!
|
|
|
|
29.05.2019 12:56:59
Нашел свою реализацию (немного подправил, версия от сегодняшнего числа). До двух раз быстрее на длинных строках и смешанном тексте (в сравнении с кодом, пост2). Выкладываю код и тест.
На данных: строка - 32 тыс. символов, строк - 10 тыс. - 10 сек, против 20 сек. через регулярки. На меньших сроках превосходство меньше, но все равно существенное. Прошу тестировать.
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
|
23.07.2019 15:22:07
bedvit, отличная функция, но для того, чтобы оставить кириллицу нужно что-то с ней сделать, т.к. преобразует в байты на 176 позиций назад и "разделяет" через 4, а не 0.
То есть: ВАСЯ это не 194/0/192/0/209/0/223/0, а 18/4/16/4/33/4/47/4
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|
|
|
23.07.2019 15:46:08
RegExp с маской "\D+" будет удалять символы не по одному, а группами, что существенно резвее
Изменено:
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
|
|||
|
|
23.07.2019 16:04:39
Jack Famous, мой код делает именно то, что нужно было по теме. Если отбирать только кириллицу, нужно изменить в макросе
Ігор Гончаренко, да, так быстрее на порядок, тест: onlyDigits 20,07031 Digits 10,64453 DigitOnly 2,636719
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
|
23.07.2019 16:08:53
Доброе время суток.
Ігор Гончаренко, шаблон "\D+", время 0,18 секунды skais675, шаблон "[^0-9]", время 1,77 секунды skais675, шаблон "[^0-9]+", время 0,27 секунды bedvit, 1,2 секунды |
|||
|
|
23.07.2019 16:20:17
bedvit, я пока всё-равно остановился на регулярках, т.к. и быстрее и передавать аргумент (маску) проще и понятнее, НО серьёзно удивился способу формирования одномерного байтового массива напрямую arr() As Byte=txt$ и обратно (строки из массива) — очень круто
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|
|
|
23.07.2019 16:27:08
Владимир
|
|||
|
|
23.07.2019 16:35:07
sokol92, спасибо
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|
|
|
23.07.2019 17:59:29
Jack Famous, спасибо, пользуйтесь.
sokol92, Владимир, спасибо за инфо. Андрей VG, Андрей, спасибо за тест. Посмотрел, что на таких больших объемах мой код в аутсайдерах. Другое дело, что в ячейку столько не влезет, поэтому не так критично. Тоже смотрю последнее время на регулярки. Есть идея зашить в функцию (C API), на это нужно время, зато для форума польза. Скорость думаю должна быть неплохая Вот, к примеру протестируй, пожалуйста функцию "DigitsXLL" в нужной разрядности XLL на своем массиве (через Application. Run, нужно просто открыть XLL, функция появится в категории "BedvitXLL") У меня следующие результаты, на моем примере (см. вложение). onlyDigits 20 сек Digits 10 сек DigitOnly 2,6 сек DigitsXLL 0,4 сек
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
|
23.07.2019 20:53:20
С твоим кодом в VBA есть и ещё проблема. Тестовый вывод показывает, что не удаляется ничего. Не пошёл и вызов Application.Run("DigitsXLL", sText), как и с Evaluate - видимо слишком длинная строка Результаты.
P. S. Решил сравнить с библиотекой .Net и тут засада. Или у меня руки не оттуда растут или... Результат
|
|||||||||||
|
|
24.07.2019 08:57:32
|
|||
|
|
24.07.2019 12:33:36
bedvit, да - я понял, что с цифрами всё ОК, но вот дальше всё-равно не догоняю…
В таблице (по вашей ссылке) Кириллица такая: 1025(Ё), 1040(А) - 1103(я), 1105(ё) 1. "ВАСЯ" по ней: 1042 | 1040 | 1057 | 1071 2. • при преобразовании в байтовый массив: 18 | 16 | 33 | 47 (через "4") 3. • при преобразовании сначала через StrConv: 18 | 16 | 33 | 47 (через "0-4-0" вместо "4") Где тут логика и как поступать???
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|
|
|
24.07.2019 12:47:04
Jack Famous,
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
|
24.07.2019 13:24:39
Jack Famous, Вот
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
|
24.07.2019 14:11:13
bedvit, и это никак не объясняет, откуда вы взяли 15, 80 и 81… С тем, как вы определяете кириллицу по разделителю "4" мне ясно, с 32 понятно - это код пробела при разделителе "0", но откуда остальные??? В таблице Юникода я что-то не то увидел…
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|
|
|
24.07.2019 14:26:59
Jack Famous, прочитали инфо по ссылке в посте 18?
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
|
24.07.2019 15:17:48
bedvit, нет)) я, балбес, признаю — не увидел Спасибо большое
Не могу только понять, из какой в какую систему перегонять надо… Сижу функции перебираю… UPD: итак, в таблице Юникод коды символов совпадают с таблицей в Excel (через =СИМВОЛ() или =Chr() в VBA) с 1 по 126, дальше пляска пошла))) В Юникоде код представлен (например, для русской "А") в десятичной (1040) или шестнадцатиричной (0410) системах счисления Пока не могу только понять, как именно из них получить 16/4 или наоборот Вроде как это восмеричная система, но тогда почему вместо 2020 (если перевести 1040 из десятичной в восьмеричную) выдаёт эти "16 и 4"? Кратность какая-то? UPD2: всё - я понял 1040 = 16 | 4 = 16 + 256*4 (для всей кириллицы будет) Вот только как
Изменено:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|
|
|
24.07.2019 18:28:55
2.1 - СОМ не делал, за неимением спроса, будет такая же скорость как и в п.2.2 2.2 - C#.NET Андрей, внес в твой код еще два варианта:
Net time: 1130,113 мсек; digits count: 1299456; all count: 43895808 Net time: 247,0247 мсек; digits count: 1299456; all count: 43895808 - вар2 Net time: 124,0124 мсек; digits count: 1299456; all count: 43895808 - вар3 С++
digits count: 43895808 time = 99, digits count: 1299456 В Шарпе неудобно работать со строками, их нельзя изменять (при изменении, по факту, создается новая строка. Есть структура, где все же можно - System.Text.StringBuilder, но как видим работает "оно" медленно) В С++ строка, это лишь массив символов, можно менять что угодно, прямо на месте. Поэтому в тестах несколько быстрее.
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||||||||||
|
|
24.07.2019 20:26:45
Изменено:
Владимир
|
|||||
|
|
25.07.2019 08:36:08
sokol92, за функции спасибо - почти уверен, что они быстрее функций листа
В любом случае, что делать с этими цифрами теперь понятно.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|||
|
|
25.07.2019 14:18:10
Андрей VG, Андрей, можно еще немножко ускорить код на C#.NET, если перейти на указатели и небезопасный код (Unsafe code). см. вариант 4.
Еще ближе к С++. upd. Немного подправил свой код.
V1-Net time: 1079,1079 мсек; digits count: 1299456; all count: 43895808 V2-Net time: 243,0243 мсек; digits count: 1299456; all count: 43895808 V3-Net time: 135,0135 мсек; digits count: 1299456; all count: 43895808 V4-Net time: 119,0119 мсек; digits count: 1299456; all count: 43895808
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||||
|
|
25.07.2019 21:44:16
Привет, Виталий.
Огромное спасибо за исследование. Сделал в ExcelDNA, но так как исходно RegEx исходно раз в восемь медленнее, то не смотря на то, что можно задействовать IsThreadSafe, получается, что VBScript.RegExp твой код на ячейках выполнять для 32000 строк за 13 секунд, а RegEx за 20!
Изменено: |
|||
|
|
25.07.2019 22:45:17
Андрей, спасибо за исследования! А DigitOnly - это код Игоря Гончаренко - выходит самый быстрый на VBA. Опять же с помощью сторонних библ. В теории я могу подлючить свою СОМ-библиотеку и обогнать в VBA - стандартную. Далее мой код на VBA, выходит 25 сек. без сторонних библиотек. Неплохо, но с библиотеками все же лучше. Считаю нужно все использовать, если есть возможность. По XLL - для интереса, возьми вариант 4 - на шарпе самый быстрый, не сильно уступает С++, заверни его в ExcelDNA. Предполагаю, отставание раза в два-пять всего лишь будет от С++.
Да C API в XLL впечатляет, конкурентов нет, кроме стандартных функций. Хочу обогнать ВПР(), но пока проигрываю (медленнее на 46%). Не удается по указателю в Excel залесть (а разыменовывать весь массив это дорого, за счёт этого проигрываю), а встроенным функциям видимо есть доступ к памяти Excel через указатель. Или используется механизм кеширования - сейчас я о нем подумываю. Если интересно - написал даже
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
|
25.07.2019 23:58:45
Привет!
Сравнение прайсов, таблиц - без настроек
|
|||||
|
|
||||