Найти цифру

Тема в разделе "1C и всё что с ней связано", создана пользователем vbs, 15 сен 2009.

  1. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Вопрос на засыпку - требуется в текстовой переменной найти первый символ, являющийся цифрой.
    Оптимальность метода диктуется тем, что эту операцию надо повторить в цикле (порядка 10 тыс. раз)
     
  2. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Кажись, на Мисте в Базе Знаний была такая тема.
     
  3. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Да я и сам, разумеется, справлюсь. А вдруг, кто предложит оригинальную идею ?
    Пивом отвечу :(
     
  4. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Ну, самое оптимальное решение может быть нетривиальным.

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

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

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    vbs, sql или дбф?

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

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

    Zab Well-Known Member
    1C Team

    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    vitfil, а 10 тыщ обращений к внешнему объекту?
    vbs, я бы писал на сях программку, которой кормил 10к строк, и получал 10к результатов.
     
  7. Hryv

    Hryv Гость

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

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


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

     
  8. vitfil

    vitfil IT-интегратор

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

    Zab Well-Known Member
    1C Team

    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    Предположительно да. Предположительно, т.к. сам не замерял.
    Поэтому и тормозная такая. При сдаче восьмерки выполнение запроса в цикле, где можно сделать один запрос считается грубой ошибкой. А если таким образом можно скормить таблицу строк и получить таблицу результатов, то я соглашусь на 100%
     
  10. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Это первое, что приходит в голову (без ВК). Да, строки примерно из 100 символов, и цифры в них сидят,как правило, в 1-й позиции,
    Но примерно 10% строк содержат текст без цифр в начале. Вот и дискуссия нехилая образовалась :)
     
  11. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    между прочим unknown181538 предложил то же самое что и Hryv
    а у мя возникнет вопрос - неужто посимвольный перебор отработает быстрее чем Найти?
     
  12. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Найти - фактически тот же самый посимвольный перебор.
    А теперь представьте, что будет быстрее - сделать посимвольный перебор строки, сравнивая код символа на принадлежность диапазону, в котором лежат коды цифр
    или же для каждой строки запускать цикл с Найти... от одного до 10 раз.
     
  13. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Сколько не размышлял, так и не понял, что такое "на сях"
     
  14. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    vbs, так какого рода база? и где находятся строки, в которых требуется искать первый символ-цифру?
    могу накидать готовый запросик, который вернет табличку нужную.
    с/с++
     
  15. Hryv

    Hryv Гость

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

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

    Zab Well-Known Member
    1C Team

    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    Улыбнул: С++. На самом деле не важно, пиши хоть на асме, если скорость критична.
     
  17. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Обработка разовая, ну, на моем компе несколько минут займет, так что выпендриваться незачем
    Так что, похоже, другого способа, как
    не видно
     
  18. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Ну как это не видно...
    В любой таблице символов, если мне не изменяет память, 0 = 30, 1 = 31, ... 9 = 39.
    В 1С есть КодСимв().
    Если (КодСимв() > 29) и (КодСимв() < 40) Тогда
    //Цифра
    КонецЕсли;
     
  19. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    vitfil, во! Клевый вариант ИМХО!
     
  20. puh14

    puh14 Well-Known Member
    1C Team

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

Поделиться этой страницей