• 🚨 29 мая стартует курс «Пентест Active Directory: от теории к практике» от Академии Кодебай

    🔍 Изучите реальные техники атак на инфраструктуру Active Directory: от первоначального доступа до полной компрометации.
    🛠️ Освойте инструменты, такие как BloodHound, Mimikatz, CrackMapExec и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальные сценарии атак.
    🧠 Получите знания, которые помогут вам стать востребованным специалистом в области информационной безопасности.

    После старта курса запись открыта еще 10 дней Подробнее о курсе ...

Найти цифру

  • Автор темы Автор темы vbs
  • Дата начала Дата начала
V

vbs

Вопрос на засыпку - требуется в текстовой переменной найти первый символ, являющийся цифрой.
Оптимальность метода диктуется тем, что эту операцию надо повторить в цикле (порядка 10 тыс. раз)
 
Кажись, на Мисте в Базе Знаний была такая тема.
 
Ну, самое оптимальное решение может быть нетривиальным.

Я бы либо перебирал строку посимвольно, и проверял бы код символа,
либо перебирал бы масситв символов и использовал метод "Найти".

Но за это пива не дадут :( .
 
vbs, sql или дбф?

Для СКЛ:
ЗагрузитьВнешнююКомпоненту("1cpp.dll");
РС = СоздатьОбъект("ODBCRecordSet");
СтрокаСимволов = "..."; //Твоя строка символов
ПозицияПервойЦифры = РС.ВыполнитьСкалярный("select PATINDEX('%[0-9]%','"+СтрокаСимволов+"')");

Для ДБФ
1. Вместо ODBC провайдера используется OLEDB.
2. Не уверен, что будет работать скалярный запрос и не уверен, что есть PATINDEX.
 
vitfil, а 10 тыщ обращений к внешнему объекту?
vbs, я бы писал на сях программку, которой кормил 10к строк, и получал 10к результатов.
 
Мне кажется, что на быстродействие повлияет не столько количество строк, сколько их длина

Если средняя длина в пределах 100 символов, то не стоит мудрить, можно просто перебирать символы стрки, используя, например, Сред() и проверять их код на больше кода 0 и меньше кода 9. Не проверял, но думаю, что не будет сильно тормозить


А вот если строки длинные и цифры в них встречаются далеко от начала, то я бы попробовал вариант

vbs, я бы писал на сях программку, которой кормил 10к строк, и получал 10к результатов.
 
vitfil, а 10 тыщ обращений к внешнему объекту?
С какого перепугу будет 10к обращений?
Объект можно создавать глобально однажды при запуске системы.
Или смущает 10к вызовов ВыполнитьСкалярный?
Я привел просто пример базовый. Разумеется, в частном случае запрос будет иным.
Приведи пример частного случая и я напишу запрос для получения необходимых данных одним запросом.
Кстати, ради интереса посмотри в профайлере, как часто 1С кидает запросы на сиквельный сервак. СУБД для того и предназначена, чтобы постоянно получать запросы, оптимизировать их вызовы и выполнять транзакции.
 
Или смущает 10к вызовов ВыполнитьСкалярный?
Предположительно да. Предположительно, т.к. сам не замерял.
Кстати, ради интереса посмотри в профайлере, как часто 1С кидает запросы на сиквельный сервак.
Поэтому и тормозная такая. При сдаче восьмерки выполнение запроса в цикле, где можно сделать один запрос считается грубой ошибкой. А если таким образом можно скормить таблицу строк и получить таблицу результатов, то я соглашусь на 100%
 
можно просто перебирать символы стрки, используя, например, Сред() и проверять их код на больше кода 0 и меньше кода 9
Это первое, что приходит в голову (без ВК). Да, строки примерно из 100 символов, и цифры в них сидят,как правило, в 1-й позиции,
Но примерно 10% строк содержат текст без цифр в начале. Вот и дискуссия нехилая образовалась :)
 
между прочим unknown181538 предложил то же самое что и Hryv
а у мя возникнет вопрос - неужто посимвольный перебор отработает быстрее чем Найти?
 
а у мя возникнет вопрос - неужто посимвольный перебор отработает быстрее чем Найти?
Найти - фактически тот же самый посимвольный перебор.
А теперь представьте, что будет быстрее - сделать посимвольный перебор строки, сравнивая код символа на принадлежность диапазону, в котором лежат коды цифр
или же для каждой строки запускать цикл с Найти... от одного до 10 раз.
 
vbs, так какого рода база? и где находятся строки, в которых требуется искать первый символ-цифру?
могу накидать готовый запросик, который вернет табличку нужную.
Сколько не размышлял, так и не понял, что такое "на сях"
с/с++
 
между прочим unknown181538 предложил то же самое что и Hryv
Я отвечал не столько о способе, сколько о условиях когда его имеет смысл применять
На копирайт не претендую :)

Найти() скорее всего работает эффективнее, чем перебор с помощью Сред(), но точно не в 10 раз
 
На самом деле не важно, пиши хоть на асме, если скорость критична.
Обработка разовая, ну, на моем компе несколько минут займет, так что выпендриваться незачем
Так что, похоже, другого способа, как
сделать посимвольный перебор строки, сравнивая код символа на принадлежность диапазону, в котором лежат коды цифр
не видно
 
В любой таблице символов, если мне не изменяет память, 0 = 30, 1 = 31, ... 9 = 39.

в 1251 0=48, 9=57. В других кодировках не смотрел. А кроме как посимвольного перебора для похожей задачи (формулы с кодами справочников как переменными использовать) так ничего в свое время и не родил.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!

Курс AD