Найти цифру

vbs

Well-Known Member
18.02.2007
1 708
3
#1
Вопрос на засыпку - требуется в текстовой переменной найти первый символ, являющийся цифрой.
Оптимальность метода диктуется тем, что эту операцию надо повторить в цикле (порядка 10 тыс. раз)
 

unknown181538

НеГуру
28.12.2008
1 417
0
#4
Ну, самое оптимальное решение может быть нетривиальным.

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

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

vitfil

IT-интегратор
02.04.2004
2 062
0
#5
vbs, sql или дбф?

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

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

Zab

Well-Known Member
07.08.2006
583
0
#6
vitfil, а 10 тыщ обращений к внешнему объекту?
vbs, я бы писал на сях программку, которой кормил 10к строк, и получал 10к результатов.
 
H

Hryv

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

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


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

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

vitfil

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

Zab

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

vbs

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

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#11
между прочим unknown181538 предложил то же самое что и Hryv
а у мя возникнет вопрос - неужто посимвольный перебор отработает быстрее чем Найти?
 

vitfil

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

vitfil

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

Hryv

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

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

vbs

Well-Known Member
18.02.2007
1 708
3
#17
На самом деле не важно, пиши хоть на асме, если скорость критична.
Обработка разовая, ну, на моем компе несколько минут займет, так что выпендриваться незачем
Так что, похоже, другого способа, как
сделать посимвольный перебор строки, сравнивая код символа на принадлежность диапазону, в котором лежат коды цифр
не видно
 

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#19
vitfil, во! Клевый вариант ИМХО!
 

puh14

Well-Known Member
11.07.2008
1 412
0
#20
В любой таблице символов, если мне не изменяет память, 0 = 30, 1 = 31, ... 9 = 39.
в 1251 0=48, 9=57. В других кодировках не смотрел. А кроме как посимвольного перебора для похожей задачи (формулы с кодами справочников как переменными использовать) так ничего в свое время и не родил.