Страница 1 из 2

InString с конца

Добавлено: 24 Январь 2017, 12:07
Андрей
Че то не могу понять, InString c конца для русского языка не работает что ли ? Или я туплю и не мало....

Вот

Код: Выделить всё

l:Adres='ВасяПетяЖ.что'
len#=Len(Clip(l:Adres))
PosDom#=InString('Ж.',UPPER(Clip(l:Adres)),1,1)
message('PosDom#='&PosDom#&' len#='&len#)
Работает, возвращает 9

а

Код: Выделить всё

l:Adres='ВасяПетяЖ.что'
len#=Len(Clip(l:Adres))
PosDom#=InString('Ж.',UPPER(Clip(l:Adres)),-1,Len#)
message('PosDom#='&PosDom#&' len#='&len#)
0 возвращает

Clarion 10.0.0.12398

InString с конца

Добавлено: 24 Январь 2017, 12:14
Дед Пахом
The only negative step value allowed is -1, and the search string must be 1 character long in this case. In other words, a negative step is not allowed with any substring greater than 1 character.
То есть 'Ж.' в поиске назад использовать нельзя.

InString с конца

Добавлено: 24 Январь 2017, 13:25
Андрей
а... вот оно шо....
Благодарю ! Не дочитал Help

InString с конца

Добавлено: 24 Январь 2017, 13:59
kreator
Ищи просто "Ж", а потом проверяй наличие следующей точки.

InString с конца

Добавлено: 24 Январь 2017, 14:05
Дед Пахом
А может подразумевалось искать одну букву "Жэ с точкой"?

InString с конца

Добавлено: 24 Январь 2017, 15:20
Андрей
Да, да
Ну на самом деле не 'Ж.' а 'Д.' в адресе надо номер дома найти
Нас. пункт ТакойТо ул. ТакаяТо д. 55 к.а кв.11
Пришлось циклик делать, коль InString неполноценная с конца

InString с конца

Добавлено: 24 Январь 2017, 16:44
RaFaeL
Напомню про сервис Дадаты на всякий случай, который такое умеет в лучшем виде )

InString с конца

Добавлено: 24 Январь 2017, 17:46
kreator
Андрей писал(а):Да, да
Ну на самом деле не 'Ж.' а 'Д.' в адресе надо номер дома найти
Нас. пункт ТакойТо ул. ТакаяТо д. 55 к.а кв.11
Пришлось циклик делать, коль InString неполноценная с конца
Вообще это чушь, разбирать строку по непонятным критериям. "Д." вполне может быть деревней, дорогой и т.д. Если, конечно, Вы точно уверены в строке, то да.
Может лучше КЛАДР посмотреть? Или, действительно, сервис Дадаты рассмотреть? На 100% не хранится там всё в одной строке.

InString с конца

Добавлено: 24 Январь 2017, 22:19
Андрей
kreator писал(а):
Андрей писал(а):Да, да
Ну на самом деле не 'Ж.' а 'Д.' в адресе надо номер дома найти
Нас. пункт ТакойТо ул. ТакаяТо д. 55 к.а кв.11
Пришлось циклик делать, коль InString неполноценная с конца
Вообще это чушь, разбирать строку по непонятным критериям. "Д." вполне может быть деревней, дорогой и т.д. Если, конечно, Вы точно уверены в строке, то да.
Может лучше КЛАДР посмотреть? Или, действительно, сервис Дадаты рассмотреть? На 100% не хранится там всё в одной строке.
Если искать "д." слева направо, то конечно можно на деревню дедушке попасть, но ежели справа налево, то в моем случае на 100% на дом попадаю.

InString с конца

Добавлено: 25 Январь 2017, 8:30
PavelNK
А не лучше ли использовать функцию StrPos?
Написать нормальный шаблон для поиска и не заниматься поиском с конца и т.д.

InString с конца

Добавлено: 26 Январь 2017, 0:22
Shur
Если очень нужно искать с конца, то можно написать функцию типа REVERSE(), переворачивающую строку. Тогда

Код: Выделить всё

PosDom#=InString(REVERSE('Ж.'),REVERSE(UPPER(Clip(l:Adres))),1,1)
даст вам ожидаемое.

InString с конца

Добавлено: 26 Январь 2017, 14:05
kreator
Shur писал(а):Если очень нужно искать с конца, то можно написать функцию типа REVERSE(), переворачивающую строку. Тогда

Код: Выделить всё
PosDom#=InString(REVERSE('Ж.'),REVERSE(UPPER(Clip(l:Adres))),1,1)

даст вам ожидаемое.
И эта функция каким-то образом должна работать по крайней мере на порядок быстрее Instring. :D

InString с конца

Добавлено: 26 Январь 2017, 14:42
Shur
kreator писал(а): И эта функция каким-то образом должна работать по крайней мере на порядок быстрее Instring.
Читаем с начала, а не с конца:
Shur писал(а): Если очень нужно...
А вообще про эффективность автор темы не спрашивал. На данном этапе, как я понимаю, его больше заботит правильный разбор адреса.
В каком режиме он делает обработку - в пакетном или ещё как -- мы не знаем.
IMHO Функция INSTRING по природе своей не быстра, поэтому переворачивание строк сильно уже не повредит.

InString с конца

Добавлено: 26 Январь 2017, 15:44
kreator
Shur писал(а):IMHO Функция INSTRING по природе своей не быстра, поэтому переворачивание строк сильно уже не повредит.
Спорить не буду, вот здесь последнее обсуждение скорости instring - http://forum.clarionlife.net/phpbb/view ... f=1&t=3751.

InString с конца

Добавлено: 26 Январь 2017, 23:26
Shur
Для пакетного режима лучше использовать самописную функцию, лишённую вышеозначенного изъяна.

Код: Выделить всё

MyInstring PROCEDURE(pat STRING, str STRING, step LONG, pos LONG),LONG
   CODE
     len1# = len(str)
     len2# = len(pat)
     if len1# < len2#
        RETURN(0)
     end      
     from# = choose(step=-1,len1#,pos)
     to# = choose(step=-1,len2#,len1#-len2#+1)
     loop i# = from# to to# by step
        if by# < 0  
           if str[i#-len2#+1:i#] = pat
              RETURN(i#-len2#+1)
           end
        else
           if str[i#:i#+len2#-1] = pat
              RETURN(i#)
           end
        end   
     end
     RETURN(0)