Подскажите пожалуйста, есть ли в Clarion функция замены подстроки в строке ?
Что-то вроде:
Код: Выделить всё
  РЕЗУЛЬТАТ = Replace(СТРОКА,'НАЙТИ ТЕКСТ','ЗАМЕНИТЬ НА ДРУГОЙ ТЕКСТ')
Заранее спасибо !
Модератор: Дед Пахом
Код: Выделить всё
  РЕЗУЛЬТАТ = Replace(СТРОКА,'НАЙТИ ТЕКСТ','ЗАМЕНИТЬ НА ДРУГОЙ ТЕКСТ')
Код: Выделить всё
FsStrReplace         FUNCTION (Loc:Str,Loc:StrSourse,Loc:StrTarg) ! Объявление процедуры
FilesOpened          LONG
Loc:StrRet           STRING(1024)
  CODE                                            ! Начало исполняемого кода
      if Loc:StrSourse=Loc:StrTarg  !проверка на совпадение исходной и целевой подстроки
         return(Loc:Str)
      .
      Loc:StrRet=Loc:Str
      k#=0
      loop
         p#=instring(Loc:StrSourse,clip(loc:strRet),1,k#+1)
         if p#=0
            break
         .
         Loc:StrRet=sub(loc:strRet,1,p#-1) & Loc:StrTarg & sub(loc:StrRet,p#+len(Loc:StrSourse),len(clip(Loc:StrRet))-p#-len(Loc:StrSourse)+1)
         k#=p#+len(Loc:StrTarg)-1
      .
  
  RETURN(Loc:StrRet)
Код: Выделить всё
  РЕЗУЛЬТАТ = REPLACE('ТРУСЫ ДЕВОЧКА 52 РАЗМЕР','52','54-52')
Тут вопрос скорее в том, что длина результата работы функции должна определяться его размером.finsoftrz писал(а): 24 Декабрь 2019, 9:31У меня строк длиннее 512 символов практически не бывает, поэтому я не заморачиваюсь
Код: Выделить всё
  РЕЗУЛЬТАТ = REPLACE('ТРУСЫ ДЕВОЧКА 52 РАЗМЕР','52','КАКАЯ-ТО ОООЧЕНЬ ДЛИННАЯ СТРОКА С ОПИСАНИЕМ')
Код: Выделить всё
! Replace      Procedure( String, String )
CStr.Replace Procedure( String FromString, String ToString)
LastIndex LONG
               CODE
               LastIndex=1
               LOOP 
                   Index# = INSTRING( FromString, Self.S, 1, LastIndex )
                   IF Index# = 0
                       RETURN
                   ELSE
                      SELF.Set( Self.S[ 1: Index#-1 ] |
                      & ToString |
                      & SELF.S[ Index# + Len( FromString) : Self.Len ] |
                      )
                      LastIndex = Index# + 1 + LEN( ToString )
                 END ! IF 
             END ! Loop 
              Return
Я имел ввиду результат внутри функции. Вариантов нет. Либо просто, быстро, с некоторым разумным ограничением. Либо подольше, посложнее, с динамическим выделением памяти для буфера результата. Выделять память можно кусками, после проверки возможного превышения текущего размера буфера. На этом форуме уже несколько раз мелькали примеры подобного решения.Игорь Столяров писал(а): 24 Декабрь 2019, 9:39Тут вопрос скорее в том, что длина результата работы функции должна определяться его размером.finsoftrz писал(а): 24 Декабрь 2019, 9:31У меня строк длиннее 512 символов практически не бывает, поэтому я не заморачиваюсь
Динамически задавать длину результата тоже не бест. И дело даже не в скорости работы, а в непредсказуемости запроса.
Например:
И даже если принимаем результат в String(512), то внутри функции этот результат может быть намного больше.Код: Выделить всё
РЕЗУЛЬТАТ = REPLACE('ТРУСЫ ДЕВОЧКА 52 РАЗМЕР','52','КАКАЯ-ТО ОООЧЕНЬ ДЛИННАЯ СТРОКА С ОПИСАНИЕМ')
Уже, наверно, неактуально. В SQL есть.Игорь Столяров писал(а): 24 Декабрь 2019, 10:28 Спасибо ! Вообще, конечно странно, что такой базовый функционал работы со строками не реализован в Clarion на уровне RTL …![]()
Игорь Столяров писал(а): 24 Декабрь 2019, 10:28Спасибо ! Вообще, конечно странно, что такой базовый функционал работы со строками не реализован в Clarion на уровне RTL …
Точно ! Спасибо. Я же помню, что где-то читал о функции ReplaceSubString() в изменениях версий Clarion …
Но учти, что если используются Легаси, то надо указать в настройках проекта использование библиотек ABC, а если рукописный ввод, то - в параметрах сборки.Игорь Столяров писал(а): 24 Декабрь 2019, 15:52Точно ! Спасибо. Я же помню, что где-то читал о функции ReplaceSubString() в изменениях версий Clarion …
Я уже даже не помню, что это такое. Последний проект перевели на ABC лет 10 назад …
У меня обратная ситуация, полностью отказался от ABC. По мне, так легаси прозрачнее. Дело привычки. А рукописных библиотек без использования шаблонов у меня много...Игорь Столяров писал(а): 24 Декабрь 2019, 16:46Я уже даже не помню, что это такое. Последний проект перевели на ABC лет 10 назад …