Добрый день!
Подскажите пожалуйста, кто знает, как можно макросом удалить из ячейки все символы, кроме цифр?
Подскажите пожалуйста, кто знает, как можно макросом удалить из ячейки все символы, кроме цифр?
|
28.05.2019 09:31:21
Добрый день!
Подскажите пожалуйста, кто знает, как можно макросом удалить из ячейки все символы, кроме цифр? |
|
|
|
|
|
28.05.2019 09:40:30
Добрый день!
Почитайте |
|
|
|
|
|
28.05.2019 11:31:58
Спасибо!
|
|
|
|
|
|
29.05.2019 12:56:59
Нашел свою реализацию (немного подправил, версия от сегодняшнего числа). До двух раз быстрее на длинных строках и смешанном тексте (в сравнении с кодом, пост2). Выкладываю код и тест.
На данных: строка - 32 тыс. символов, строк - 10 тыс. - 10 сек, против 20 сек. через регулярки. На меньших сроках превосходство меньше, но все равно существенное. Прошу тестировать.
Изменено: - 29.05.2019 13:09:29
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
|
|
|
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:08:35
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
|
|||
|
|
|
|
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 18:07:22
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
|
|
|
23.07.2019 20:53:20
С твоим кодом в VBA есть и ещё проблема. Тестовый вывод показывает, что не удаляется ничего. Не пошёл и вызов Application.Run("DigitsXLL", sText), как и с Evaluate - видимо слишком длинная строка
P. S. Решил сравнить с библиотекой .Net и тут засада. Или у меня руки не оттуда растут или... Результат
|
|||||||||||
|
|
|
|
23.07.2019 23:37:28
По DigitsXLL понятно, это функция листа, в ячейку больше 32 тысяч не лезет. Сразу не сообразил.
По Digits в VBA - пока не понял, гляну. На .NET тоже глянем, как можно ускорить. Здесь появляется два момента: 1. Самая быстрая функция для расчетов в ячейке Excel, макс 32 767 знаков(VBA, COM, XLL) 2. Самая быстрая функция для любого количества знаков. 2.1 что бы можно использовать в VBA (VBA, COM) 2.2 любой инструмент (EXE на .NET, EXE на С++) Что хотим потестировать? Готов поучаствовать везде.
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
|
|
|
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 12:47:14
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
|
|
|
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:12:04
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|
|
|
|
|
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 16:11:51
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел)
|
|
|
|
|
|
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 19:30:28
«Бритва Оккама» или «Принцип Калашникова»?
|
|||||||||||
|
|
|
|
24.07.2019 18:32:44
может как идея создать переменную (1)="0123456789" и потом каждый символ в тестируемом значении проверять на наличие в этой переменной (1) и если есть то сувать в еще одну переменную (2). и в конце менять значение на переменнную (2). незнаю на сколько это быстро будет)))
|
|
|
|
|
|
24.07.2019 20:26:45
Изменено: - 24.07.2019 20:28:12
Владимир
|
|||||
|
|
|
|
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 15:13:42
(upd. Немного подправил свой код.)
«Бритва Оккама» или «Принцип Калашникова»?
|
|||||
|
|
|
|
25.07.2019 21:44:16
Привет, Виталий.
Огромное спасибо за исследование. Сделал в ExcelDNA, но так как исходно RegEx исходно раз в восемь медленнее, то не смотря на то, что можно задействовать IsThreadSafe, получается, что VBScript.RegExp твой код на ячейках выполнять для 32000 строк за 13 секунд, а RegEx за 20!
Изменено: - 25.07.2019 21:45:32
|
|||
|
|
|
|
25.07.2019 22:45:17
Андрей, спасибо за исследования! А DigitOnly - это код Игоря Гончаренко - выходит самый быстрый на VBA. Опять же с помощью сторонних библ. В теории я могу подлючить свою СОМ-библиотеку и обогнать в VBA - стандартную. Далее мой код на VBA, выходит 25 сек. без сторонних библиотек. Неплохо, но с библиотеками все же лучше. Считаю нужно все использовать, если есть возможность. По XLL - для интереса, возьми вариант 4 - на шарпе самый быстрый, не сильно уступает С++, заверни его в ExcelDNA. Предполагаю, отставание раза в два-пять всего лишь будет от С++.
Да C API в XLL впечатляет, конкурентов нет, кроме стандартных функций. Хочу обогнать ВПР(), но пока проигрываю (медленнее на 46%). Не удается по указателю в Excel залесть (а разыменовывать весь массив это дорого, за счёт этого проигрываю), а встроенным функциям видимо есть доступ к памяти Excel через указатель. Или используется механизм кеширования - сейчас я о нем подумываю. Если интересно - написал даже и .
Изменено: - 25.07.2019 23:35:31
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
|
|
|
25.07.2019 23:58:45
Привет!
PHP Битрикс24 REST API, Google Apps Script, Excel VBA Windows Mac
|
|||||
|
|
|
||||