Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.54.7] |
|
Сообщ.
#1
,
|
|
|
Ребята подскажите как решить такую задачу. Уже три дня ломаю голову и результата ноль.
Задача: Удалить текст между данными символами включая - сами символы Текст до обработки: TEST "111111> TEST1 TEST "111111> TEST1 TEST "111111> TEST1 TEST """111111> TEST1 TEST """111111> TEST1 TEST """111111> TEST1 TEST """222222>> TEST2 TEST """222222>> TEST2 TEST """222222>> TEST2 TEST """333>>> TEST3 TEST """333>>> TEST3 TEST """333>>> TEST3 TEST "444444>>> TEST4 TEST "444444>>> TEST4 TEST "444444>>> TEST4 TEST "444444>>> TEST4 TEST ""5555>>> TEST5 TEST ""5555>>> TEST5 Результат, после обработки должен быть вот в таком виде: TEST TEST1 TEST TEST1 TEST TEST1 TEST TEST1 TEST TEST1 TEST TEST1 TEST TEST2 TEST TEST2 TEST TEST2 TEST TEST3 TEST TEST3 TEST TEST3 TEST TEST4 TEST TEST4 TEST TEST4 TEST TEST4 TEST TEST5 TEST TEST5 П/C: Обработка из файла и сохранение в файл. Я не совсем деревянный и по отдельности то знаю как сделать. К примеру делал вот так (Работает, но постоянно нужно подстраивать количество символов в k+3 и i+1): var s,res: String; i,k: Integer; begin s:=Memo1.Lines.text; i:=pos('"""',s); while i<>0 do begin k:=pos('>>',s); res:=copy(s,i+1,k-i); delete(s,i,k+3-i); i:=pos('"""',s); delete(s,pos('"""',s),pos('>>',s)+3-pos('"""',s)); end; Memo1.Lines.text:=s; end; Может у кого есть опыт по решению такой задачи. Заранее благодарен за помощь. |
Сообщ.
#2
,
|
|
|
Пример на псевдоязыке, который показывает как можно прочитать то что между символами "...<, причём, не важно сколько раз эти символы будут повторятся """...<< ""...<<<<< и т.д.
String find(String text) { start = pos("\"", text); // Получаем позицию первого символа кавычки end = pos("<",text,start); // Получаем позицию первого символа < после кавычек for(int i=end;;){ if(text[i++]!='<'){ // ищем конец последовательности символов < end = start-i; // вычисляем сколько символов мы прошли с первой кавычки break; } } return Copy(text, start, end); // возвращает то что попало между первой кавычкой " и последним символом < } |
Сообщ.
#3
,
|
|
|
Надо выкусить всё, что находится между первым " и последним > - так, что ли?
Простейший, хотя и тормознутый вариант startPos := 1; repeat startPos := PosEx(s, '"', startPos); if startPos = 0 then Break; // не найдено '"' endPos := PosEx(s, '>', startPos + 1); if endPos = 0 then Break; // не найдено '>' while (endPos < Length(s)) and (s[endPos+1] = '>') do // ищем последний '>' Inc(endPos); Delete(s, startPos, endPos-startPos { ! тут проверить, возможно, надо будет +-1 } ); until False; Если же делать по уму, то результирующая строка делается длиной с исходную, и в нее копируются нужные фрагменты, а в конце результат урезается до фактической длины. Добавлено Цитата VisualProg @ Пример на псевдоязыке Я всегда подозревал, что Си это псевдоязык )))) |
Сообщ.
#4
,
|
|
|
Цитата Fr0sT @ Я всегда подозревал, что Си это псевдоязык )))) В сях нет таких функций и строк, из делфей смутно помню Pos/Copy а как сделать пустой for(;;) не сообразил... решил сократить время |
Сообщ.
#5
,
|
|
|
VisualProg,Fr0sT, Ребята, спасибо за наставление. Буду разбираться.
|
Сообщ.
#6
,
|
|
|
Друзья, тут все элементы отделены пробелом. Тут, мне кажется, через StringList.DelimitedText нужно действовать.
Например так: Var FIn,FOut:TextFile; SIn,SOut:String; Sl:TStringList; I:Integer; begin AssignFile(FIn,'C:\1.txt'); AssignFile(FOut,'C:\out.txt'); Reset(FIn); if FileExists('C:\out.txt') then Append(Fout) else Rewrite(FOut); Sl:=TStringList.Create; SL.QuoteChar:=' '; while not EOF(Fin) do begin readln(FIn,SIn); SL.DelimitedText:=SIn; Sout:=''; for I := 0 to SL.Count-1 do begin SIn:=SL[I]; if (SIn[1]<>'"') and (SIn[Length(SIn)]<>'>') then SOut:=SOut + SIn+' '; end; Writeln(FOut,Sout); end; Sl.Free; CloseFile(FIn); CloseFile(FOut); end; для 100% совпадения с первым постом нужно последние пробелы убирать из текста |
Сообщ.
#7
,
|
|
|
Цитата ^D^ima @ Например так Ужасно. |
Сообщ.
#8
,
|
|
|
Цитата Fr0sT @ Ужасно. Это не конструктивная критика. |
Сообщ.
#9
,
|
|
|
^D^ima, Огромное спасибо! Все работает как часики!
|