Форум
Написать нам
  • Страница 1 из 1
  • 1
Модератор форума: as-master  
МНОГОКРАТНАЯ ЗАМЕНА ПОДСТРОКИ В СТРОКЕ
as-masterДата: Среда, 21 Марта 2007, 20:04 | Сообщение # 1
Группа: Удаленные





Имеется: строка, выдернутая из текстового файла и записанная в переменную string$.

Нужно: найти в строке ВСЕ некоторые символы (например, все запятые)
и заменить их на переменные a$[i].

В чём сложность:
каждый найденный символ (каждую запятую) нужно заменить разными
переменными, которые выдергиваются из массива случайным образом. Примерно так:

i=RND(99)+1

Причём, каждая переменная a$[i] имеет свою длину символов, которая заранее неизвестна
(это так, информация на всякий случай).

Короче. Если тупо использовать команду StrChange и написать сценарий так:

FromString$=','
i=RND(99)+1
string$=StrChange(string$,FromString$,a$[i])

то все запятые в строке заменятся одной и той же переменой a$[i], а нужно РАЗНЫМИ!!!

 
toizyДата: Среда, 21 Марта 2007, 21:18 | Сообщение # 2
Группа: Удаленные





Quote (as-master)
Если тупо использовать команду StrChange

Именно, что тупо. А слабо сделать так:
Code

Source$='123, 456, 789'
ToAdd$=' моё,'
Dest$=''
Quest$=','
For i=1 To Infinity
p=POS(Quest$,Source$)
If (p=0) Then
Dest$=Dest$+Source$
Break()
End
str$=StrCopy(Source$,1,p)
Dest$=Dest$+str$+ToAdd$
Source$= StrDel(Source$,1,p)
Next i
Message("","Dest$")
 
as-masterДата: Четверг, 22 Марта 2007, 10:12 | Сообщение # 3
Группа: Удаленные





Quote (toizy)
А слабо сделать так:

Речь шла не о том, чтобы заменить ВСЕ найденнные элементы в строке,
а о том, чтобы заменить все элементы РАЗНЫМИ вставками (переменными).
Задавая вопрос, я на это специально обратил внимание.

А в твоем примере все найденные запятые заменяются одним и тем же
словом ' моё,' взятым из переменой ToAdd$.

А мне нужно, чтобы переменая выбиралась случайным образом из массива,
условно называемом ToAdd$[i], и была всегда разной.

И вообще, если на то пошло, функция StrChange() прекрасно заменяет именно все
элементы строки, отвечающие запросу Quest$. Без всяких твоих ухищрений :)

 
VictorДата: Четверг, 22 Марта 2007, 14:05 | Сообщение # 4
MMB Club
Группа: Проверенные
Сообщений: 15
Репутация: 1
Награды: 0
Статус: Offline
Лови:
Code
string$='I,I,I,I,I'
FromString$=','
**************************
For n=1 To Infinity
   i=RND(99)+1
   a=POS(FromString$,string$)
   If (a<>0) Then
     string$=StrSet(string$,a,a$[i])
   Else
     Break()
   End
Next n
***************************
Message("","string$")
 
as-masterДата: Четверг, 22 Марта 2007, 15:19 | Сообщение # 5
Группа: Удаленные





Вот сколько делаешь в ММВ проектов, столько и возникает новых,
совершенно непредвиденных проблем.

Victor, вставил твой скрипт непосредственно в свой проект - выдаёт
какую-то лажу. Тогда я для чистоты эксперимента вставил его
в новый проект, только в начале приписал небольшой массив переменных a$[i]:

a$[1]=' раз '
a$[2]=' два '
a$[3]=' три '
a$[4]=' четыре '
a$[5]=' пять '
a$[6]=' шесть '
a$[7]=' семь '
a$[8]=' восемь '
a$[9]=' девять '
a$[10]=' десять '
string$='I,I,I,I,I'
FromString$=','
**************************
For n=1 To Infinity
i=RND(9)+1
a=POS(FromString$,string$)
If (a<>0) Then
string$=StrSet(string$,a,a$[i])
Else
Break()
End
Next n
***************************
Message("","string$")

Проверяю - всё работает! Что такое, мля?... Стал разбираться и нашел
проблему. Она заключается в том, что мои РЕАЛЬНЫЕ (не в этом примере)
переменные a$[i] ТОЖЕ содержат в себе запятые!!! И что? И эти запятые
в инфинитивном цикле тоже начинают учитываться и так, слава Богу,
не до бесконечности, но многократно smile

То есть, если в приведенном выше практическом примере ты добавишь запятые
ХОТЯ БЫ В ПОЛОВИНУ переменных a$[i], вот таким образом:

a$[1]=' раз '
a$[2]=' два '
a$[3]=' три '
a$[4]=' четыре '
a$[5]=' пять '
a$[6]=', шесть '
a$[7]=', семь '
a$[8]=', восемь '
a$[9]=', девять '
a$[10]=', десять '
string$='I,I,I,I,I'
FromString$=','
**************************
For n=1 To Infinity
i=RND(9)+1
a=POS(FromString$,string$)
If (a<>0) Then
string$=StrSet(string$,a,a$[i])
Else
Break()
End
Next n
***************************
Message("","string$")

то проблему ты сразу увидишь. Попробуй. Ну, а если запятые добавить
ВО ВСЕ переменные a$[i], то программа просто зависнет, потому-что скрипт
никогда не закончится.

Ну что? Вновь появившаяся проблема ясна?
Тогда продолжаем разговор :)

 
VictorДата: Четверг, 22 Марта 2007, 17:37 | Сообщение # 6
MMB Club
Группа: Проверенные
Сообщений: 15
Репутация: 1
Награды: 0
Статус: Offline
Не знаю подойдет ли тебе такой способ, но запятые в твоих
реальных переменных можно заменить какими-нибудь редкими
символами, а в конце заменить символы на запятые.

a$[1]=' раз '
a$[2]=' два '
a$[3]=' три '
a$[4]=' четыре '
a$[5]=' &&& пять '
a$[6]=' &&& шесть '
a$[7]=' &&& семь '
a$[8]=' &&& восемь '
a$[9]=' &&& девять '
a$[10]=' &&& десять '
string$='I,I,I,I,I'
FromString$=','
**************************
For n=1 To Infinity
i=RND(9)+1
a=POS(FromString$,string$)
If (a<>0) Then
string$=StrSet(string$,a,a$[i])
Else
Break()
End
Next n
string$=StrChange(string$,'&&&',',')
***************************
Message("","string$")

 
toizyДата: Четверг, 22 Марта 2007, 18:28 | Сообщение # 7
Группа: Удаленные





Quote (as-master)
Она заключается в том, что мои РЕАЛЬНЫЕ (не в этом примере)
переменные a$[i] ТОЖЕ содержат в себе запятые!!!

Вот как раз для этого в МОЁМ коде ты берёшь из ОДНОЙ переменной и кладёшь в ДРУГУЮ.
Quote (Victor)
но запятые в твоих
реальных переменных можно заменить какими-нибудь редкими
символами

Вот фигнёй страдать придётся.
Если честно, я думал, вы поймёте мою идею, но ошибся. Вот код, работает:
Code

a$[1]=' раз запятая, '
a$[2]=' два запятых,, '
a$[3]=' дофига запятых,,,, '
a$[4]=' четыре '
a$[5]=' пять '
a$[6]=' шесть '
a$[7]=' семь '
a$[8]=' восемь '
a$[9]=' девять '
a$[10]=' десять '
**
Source$='123, 456, 789, abc, def'
Dest$=''
Quest$=','
For i=1 To Infinity
   c=RND(9)+1
   p=POS(Quest$,Source$)
   If (p=0) Then
     Dest$=Dest$+Source$
     Break()
   End
   str$=StrCopy(Source$,1,p)
   Dest$=Dest$+str$+a$[c]
   Source$= StrDel(Source$,1,p)
Next i
Message("","Dest$")


Сообщение отредактировал toizy - Четверг, 22 Марта 2007, 19:36
 
as-masterДата: Пятница, 23 Марта 2007, 16:43 | Сообщение # 8
Группа: Удаленные





Quote (Victor)
Не знаю подойдет ли тебе такой способ, но запятые в твоих реальных
переменных можно заменить какими-нибудь редкими символами, а в конце заменить
символы на запятые.

В сущности, это выход. Хоть и несколько неприятный...

Quote (toizy)
Вот код, работает:

Надеюсь, что мы поняли друг друга.
Но проверю только в оффлайне, напишу потом.

Добавлено (23 Марта 2007, 16:43)
---------------------------------------------
toizy, твой скрипт на первый взгляд работает правильно,
но все-таки он иногда выдает лишние запятые. Если например задать
переменные такие:

a$[1]=', раз, '
a$[2]=', два, '
a$[3]=', три, '
a$[4]=', четыре, '
a$[5]=', пять, '
a$[6]=', шесть, '
a$[7]=', семь, '
a$[8]=', восемь, '
a$[9]=', девять, '
a$[10]=', десять, '

то иногда выскакивают по две рядом стоящие запятые...
А ведь не должно.

 
toizyДата: Пятница, 23 Марта 2007, 17:18 | Сообщение # 9
Группа: Удаленные





Quote (as-master)
иногда выскакивают по две рядом стоящие запятые...
А ведь не должно.

Нет, ну ты меня удивляешь, ей-Богу! Ты ж смотри, как Я пишу:
Code

a$[1]=' раз запятая, '  
a$[2]=' два запятых,, '

А теперь смотри, как ТЫ пишешь:
Code

a$[1]=', раз, '  
a$[2]=', два, '  

Чуешь разницу? Ты либо не делай так, чтобы первым символом в твоих переменных была запятая, либо поправь скрипт таким образом:

a$[1]=', раз запятая, '  
a$[2]=', два запятых,, '  
a$[3]=', дофига запятых,,,, '  
a$[4]=', четыре ,'  
a$[5]=', пять ,'  
a$[6]=', шесть ,'  
a$[7]=', семь ,'  
a$[8]=', восемь ,'  
a$[9]=', девять ,'  
a$[10]=', десять ,'  
**  
Source$='123, 456, 789, abc, def'  
Dest$=''  
Quest$=','  
For i=1 To Infinity  
    c=RND(9)+1  
    p=POS(Quest$,Source$)  
    If (p=0) Then  
      Dest$=Dest$+Source$  
      Break()  
    End    
    str$=StrCopy(Source$,1,p-1)  
    Dest$=Dest$+str$+a$[c]  
    Source$= StrDel(Source$,1,p)  
Next i  
Message("","Dest$")

Сообщение отредактировал toizy - Пятница, 23 Марта 2007, 17:24
 
as-masterДата: Пятница, 23 Марта 2007, 19:18 | Сообщение # 10
Группа: Удаленные





Ну да, это я опять тормознул. Так ведь и должно получиться было.
Вот только еще одна проблема: часть этих переменных запятую спереди имеет,
а другая часть - нет... :-(
 
toizyДата: Пятница, 23 Марта 2007, 19:31 | Сообщение # 11
Группа: Удаленные





Тады снова двойное решение.
Вариант I. Самый простой. Убрать во всех переменных передние запятые, оставив только задние. Блокнот им всем в руки smile
Вариант II. Универсальный. Внутри цикла после str$=StrCopy(Source$,1,p-1) пишем
Code

ver$=StrCopy(a$[i], 1, 1)
If (ver$ = ',') Then
   a$[i] =StrDel(a$[i], 1, 1)
End

Добавлено (23 Марта 2007, 19:31)
---------------------------------------------
Согласно первому варианту код получается таким:

Code

a$[1]=' раз запятая, '
a$[2]=' два запятых, '
a$[3]=' дофига запятых, '
a$[4]=' четыре, '
a$[5]=' пять, '
a$[6]=' шесть, '
a$[7]=' семь, '
a$[8]=' восемь, '
a$[9]=' девять, '
a$[10]=' десять, '
**
Source$='123, 456, 789, abc, def'
Dest$=''
Quest$=','
For i=1 To Infinity
   c=RND(9)+1
   p=POS(Quest$,Source$)
   If (p=0) Then
     Dest$=Dest$+Source$
     Break()
   End
   str$=StrCopy(Source$,1,p)
   Dest$=Dest$+str$+a$[c]
   Source$= StrDel(Source$,1,p)
Next i
Message("","Dest$")
 
as-masterДата: Пятница, 23 Марта 2007, 21:02 | Сообщение # 12
Группа: Удаленные





Вобщем, остановился на этом варианте - без запятых в начале.
Всё работает, ОК. Спасибо!

Теперь задачка посложнее.
Заменяем каждую нечетную запятую, а каждую ЧЁТНУЮ - игнорируем.
Основа скрипта - та же. Слабо?

Это, чтоб я мог сделать опции подмены - сильнее, слабее
МАТериализовать текст :)

 
toizyДата: Пятница, 23 Марта 2007, 21:11 | Сообщение # 13
Группа: Удаленные





Code
a$[1]=' раз запятая, '
a$[2]=' два запятых, '
a$[3]=' дофига запятых, '
a$[4]=' четыре, '
a$[5]=' пять, '
a$[6]=' шесть, '
a$[7]=' семь, '
a$[8]=' восемь, '
a$[9]=' девять, '
a$[10]=' десять, '
**
Source$='123, 456, 789, abc, def'
Dest$=''
Quest$=','
Over=FALSE
For i=1 To Infinity
   c=RND(9)+1
   p=POS(Quest$,Source$)
   If (p=0) Then
     Dest$=Dest$+Source$
     Break()
   End
   **
   str$=StrCopy(Source$,1,p)
   Dest$=Dest$+str$
   If (Over) Then
     Dest$= Dest$+a$[c]
   End
   Over=Over<>TRUE
   **
   Source$= StrDel(Source$,1,p)
Next i
Message("","Dest$")

Добавлено (23 Марта 2007, 21:11)
---------------------------------------------
Но тогда уж не через одну, а через случайный промежуток, скажем, в пределах от 1 до 3-х запятых

 
  • Страница 1 из 1
  • 1
Поиск: