Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2007, 19:25   #1
General
 
Регистрация: 03.12.2006
Сообщений: 5
По умолчанию Удаление спецсимволов

Доброго времени суток!
Возникла проблема такого рода: в текстовом файле необходимо убрать лишние пробелы и перевод строки (Enter).
Была написана следующая подпрограма:
var
s: String;
i,k:integer;
begin
s:= Memo1.Text;
k:=length(s);
i:=1;
while i<(k-1)do
begin
if (s[i]=Chr(32)) and (s[i+1]=Chr(32)) or (s[i]=Chr(13)) then
begin
Delete(s,(i+1),1);
i:=i+1;
k:=k-1;
end
else
begin
i:=i+1;
end;
end;
Memo2.text:=s;
end;

В результате удалются не все лишние пробелы,а символ перевода строки вообще не удаляется?!
Не пойму в чем дело? Или я на столько тупой?
General вне форума Ответить с цитированием
Старый 20.11.2007, 20:07   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Как только вы удаляете символ, длина строки уменьшается.
Следствие - нарушается порядок просмотра и следующий анализируемый символ - через один.
В куске
Delete(s,(i+1),1);
i:=i+1;
уберите i:=i+1;
mihali4 вне форума Ответить с цитированием
Старый 20.11.2007, 23:50   #3
General
 
Регистрация: 03.12.2006
Сообщений: 5
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
В куске
Delete(s,(i+1),1);
i:=i+1;
уберите i:=i+1;
При изменении кода по Вашему совету в итоге от текста остается только первая строка и больше ничего...

Если убирать i:=i+1; то, на мой взгляд, не будет перехода к следующему символу? или я ошибаюсь?

З.Ы. При изменении Delete(s,(i+1),1); на Delete(s,i,1); результат не меняется!?
General вне форума Ответить с цитированием
Старый 21.11.2007, 00:04   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Если убирать i:=i+1; то, на мой взгляд, не будет перехода к следующему символу?
Пример:
Исходная строка
АБВ%%ГДЕЖЗ (% - это пробелы)
Счетчик достигает значения 4, это - позиция пробела.
Пробел удаляется, получаем
АБВ%ГДЕЖЗ
По вашему варианту счетчик увеличивается на 1 и становится = 5, т.е. следующим будет анализироваться символ... Какой? Символ "Г", и второй пробел будет пропущен...
mihali4 вне форума Ответить с цитированием
Старый 21.11.2007, 07:10   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

А вот такой вариант подойдет

Код:
procedure Zamena (var AStr: String; Bilo, Nado: String);
var
  i, lb, ln, ls: Integer;
begin
  lb := Length (Bilo);
  ln := Length (Nado);
  ls := Length (AStr);
  i := Pos (Bilo, AStr);
  while i <> 0 do begin
    AStr := Copy (AStr, 1, i-1) + Nado + Copy (AStr, i+lb, ls-i-lb);
    ls := ls + ln - lb;
    i := Pos (Bilo, AStr);
  end;
end;

...
  s := Memo1.Text;
  Zamena (s, #13, ' ');
  Zamena (s, #10, ' ');
  Zamena (s, '  ', ' ');
  Edit1.Text := s;
...
Знак переноса - это вроде #13+#10.
Sibedir вне форума Ответить с цитированием
Старый 21.11.2007, 08:23   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Насчет лишних пробелов можно так:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;e,s:string;
begin
//********* FOR ******************
for i :=0  to Memo1.Lines.Count-1  do
begin
 e:=Memo1.Lines[i];
 repeat
  s:=e;
  e:=StringReplace(s,'  ',' ',[rfReplaceAll]);
 until e=s;
  e:=StringReplace(s,' ',' ',[rfReplaceAll]);
 Memo1.Lines[i]:=e;
end;
Memo1.Lines.Delimiter:=#1;
s:=Memo1.Lines.DelimitedText;
s:=StringReplace(s,Memo1.Lines.Delimiter,'',[rfReplaceAll]);
Memo2.Lines.Add(s);
//******* END FOR ****************{}
end;
т.е. загружаем в Мемо (Это именно мемо поле) файл и нажимаем на кнопку.

Здесь и переводы кареток удаляются но кривовато, надеюсь смысл ясен.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.11.2007, 17:19   #7
General
 
Регистрация: 03.12.2006
Сообщений: 5
По умолчанию

Благодарю всех за ответы.
Ваши варианты попробую и обязательно отпишусь.
А что, выходит мой вариант совсем не подходит?
General вне форума Ответить с цитированием
Старый 21.11.2007, 17:35   #8
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Сообщений: 414
По умолчанию

Попробуй ещё функцию Trim(s:string)
Нет невыполнимых задач, всё дело времени...
D-mon вне форума Ответить с цитированием
Старый 21.11.2007, 21:26   #9
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

stringreplace (str,' ','',[rfreplaceall]);
stringreplace (str,#13#10,'',[rfreplaceall]);
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 22.11.2007, 07:00   #10
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
А что, выходит мой вариант совсем не подходит?
потому что
Цитата:
В результате удалются не все лишние пробелы,а символ перевода строки вообще не удаляется?!
Просто специально для таких целей программисты компании Borland и писали все те процедуры, на основе которых построены наши решения.

::: Кстати, я сам про StringReplace совсем забыл. Конечно же решение Квэнди самое правильное.
Хотя я все-таки поменял бы местами
Код:
stringreplace (str,#13#10,' ',[rfreplaceall]);
stringreplace (str,'  ',' ',[rfreplaceall]);

Последний раз редактировалось Sibedir; 22.11.2007 в 07:04.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление из system32 JRcoker Общие вопросы C/C++ 2 04.08.2008 00:32
Удаление файлов Amery Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 04.05.2008 14:46
Каскадное удаление BustA SQL, базы данных 1 16.01.2008 10:31
Удаление файла Македонский Общие вопросы Delphi 5 06.09.2007 11:46
Удаление символов MURAD Общие вопросы C/C++ 3 19.08.2007 01:25