Найти цифру

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

vbs

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

unknown181538

Кажись, на Мисте в Базе Знаний была такая тема.
 
U

unknown181538

Ну, самое оптимальное решение может быть нетривиальным.

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

Но за это пива не дадут :( .
 
V

vitfil

vbs, sql или дбф?

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

Для ДБФ
1. Вместо ODBC провайдера используется OLEDB.
2. Не уверен, что будет работать скалярный запрос и не уверен, что есть PATINDEX.
 
Z

Zab

vitfil, а 10 тыщ обращений к внешнему объекту?
vbs, я бы писал на сях программку, которой кормил 10к строк, и получал 10к результатов.
 
H

Hryv

Мне кажется, что на быстродействие повлияет не столько количество строк, сколько их длина

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


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

vbs, я бы писал на сях программку, которой кормил 10к строк, и получал 10к результатов.
 
V

vitfil

vitfil, а 10 тыщ обращений к внешнему объекту?
С какого перепугу будет 10к обращений?
Объект можно создавать глобально однажды при запуске системы.
Или смущает 10к вызовов ВыполнитьСкалярный?
Я привел просто пример базовый. Разумеется, в частном случае запрос будет иным.
Приведи пример частного случая и я напишу запрос для получения необходимых данных одним запросом.
Кстати, ради интереса посмотри в профайлере, как часто 1С кидает запросы на сиквельный сервак. СУБД для того и предназначена, чтобы постоянно получать запросы, оптимизировать их вызовы и выполнять транзакции.
 
Z

Zab

Или смущает 10к вызовов ВыполнитьСкалярный?
Предположительно да. Предположительно, т.к. сам не замерял.
Кстати, ради интереса посмотри в профайлере, как часто 1С кидает запросы на сиквельный сервак.
Поэтому и тормозная такая. При сдаче восьмерки выполнение запроса в цикле, где можно сделать один запрос считается грубой ошибкой. А если таким образом можно скормить таблицу строк и получить таблицу результатов, то я соглашусь на 100%
 
V

vbs

можно просто перебирать символы стрки, используя, например, Сред() и проверять их код на больше кода 0 и меньше кода 9
Это первое, что приходит в голову (без ВК). Да, строки примерно из 100 символов, и цифры в них сидят,как правило, в 1-й позиции,
Но примерно 10% строк содержат текст без цифр в начале. Вот и дискуссия нехилая образовалась :)
 
K

KiR

между прочим unknown181538 предложил то же самое что и Hryv
а у мя возникнет вопрос - неужто посимвольный перебор отработает быстрее чем Найти?
 
V

vitfil

а у мя возникнет вопрос - неужто посимвольный перебор отработает быстрее чем Найти?
Найти - фактически тот же самый посимвольный перебор.
А теперь представьте, что будет быстрее - сделать посимвольный перебор строки, сравнивая код символа на принадлежность диапазону, в котором лежат коды цифр
или же для каждой строки запускать цикл с Найти... от одного до 10 раз.
 
V

vitfil

vbs, так какого рода база? и где находятся строки, в которых требуется искать первый символ-цифру?
могу накидать готовый запросик, который вернет табличку нужную.
Сколько не размышлял, так и не понял, что такое "на сях"
с/с++
 
H

Hryv

между прочим unknown181538 предложил то же самое что и Hryv
Я отвечал не столько о способе, сколько о условиях когда его имеет смысл применять
На копирайт не претендую :)

Найти() скорее всего работает эффективнее, чем перебор с помощью Сред(), но точно не в 10 раз
 
V

vbs

На самом деле не важно, пиши хоть на асме, если скорость критична.
Обработка разовая, ну, на моем компе несколько минут займет, так что выпендриваться незачем
Так что, похоже, другого способа, как
сделать посимвольный перебор строки, сравнивая код символа на принадлежность диапазону, в котором лежат коды цифр
не видно
 
P

puh14

В любой таблице символов, если мне не изменяет память, 0 = 30, 1 = 31, ... 9 = 39.

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

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