Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оптимальный способ парсинга строк. [D7, XP]


operator ©   (2008-03-24 12:44:00) 

Всем привет,
есть срока вида:
подстрока1#подстрока2# и тд
необходимо вызвать операцию над каждой подстрокой.

в голову пришло два варианта реализации:

procedure TForm1.Button2Click(Sender: TObject);
var s,d:string; g:integer;
begin
  s:=edit1.text;
  while s <> '' do begin
     g:=pos(#35,s);
     d:=copy(s,1,g-1);
     delete(s,1,g);
     memo1.Lines.Add(d)
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var s,buf:string;
   i,g:integer;
begin
   s:=edit1.text;
   g:=length(s);
   buf:='';
   for i:= 1 to g do
   case s[i] of
   #35: begin
      memo1.Lines.Add(buf);
      buf:='';
   end;
   else buf:=buf+s[i]
   end;
end;


Скажите какой является наиболее быстрым и правильным? или возможнон есть иной более верный способ? (скорость выполнения особенно важна, т.к. таких строк будет очень много)


Anatoly Podgoretsky   (2008-03-24 20:21:00) [1]

> operator  (24.03.2008 12:44:00)  [0]

Ты уже измерил, или это задачка для форума?


Reindeer Moss Eater   (2008-03-24 15:14:00) [2]

Если строк много, то получишь тормоза по любому.


trubin   (2008-03-24 15:11:00) [3]


> Люди, курите регулярные выражения.


Если строк много, получишь неслабые тормоза


Сергей М.   (2008-03-24 14:33:00) [4]

Ну эт да).. против лома не попрешь)


Reindeer Moss Eater   (2008-03-24 14:29:00) [5]

Зато точно насмерть


Сергей М.   (2008-03-24 14:19:00) [6]


> Reindeer Moss Eater ©   (24.03.08 14:17) [10]


Из пушки же воробьям)


Reindeer Moss Eater   (2008-03-24 14:17:00) [7]

Люди, курите регулярные выражения.


Сергей М.   (2008-03-24 14:01:00) [8]


> operator ©   (24.03.08 13:55) [8]


Т.е. пробельные символы попросту удаляюся из оригинала, прежде чем ты его сплитишь ?

Тогда все просто - удаляешь пробельные символы, после чего выполнение сплита можно реализовать вот таким изящным способом:

s: TStringList;
..
sl.Delimiter := '#';
sl.DelimitedText := s;


operator   (2008-03-24 13:55:00) [9]


>  StringReplace дважды ?
>


виноват, указал пример неполностью,
в оригинал после
s:=edit1.text;
будет еще и
s:=stringreplace(s,' ','',[rfreplaceall]);
s:=stringreplace(s,#9,'',[freplaceall]);


> длина строки buf растет, что приводит к многократному перераспределению
> памяти.


а если объявить ее
buf:string[200];
если я точно знаю, что длина подстрок не превышает 200 символов.


Семеныч   (2008-03-24 13:46:00) [10]

> какой является наиболее быстрым и правильным?

Правильные - оба. Более быстрый - первый.  

В первом варианте длина строки s только уменьшается, поэтому память не перераспределяется. Во втором - наоборот, длина строки buf растет, что приводит к многократному перераспределению памяти. Поэтому второй вариант медленнее первого.

Еще: в первом варианте переменная d - лишняя. Можно сразу:
memo1.Lines.Add(copy(s,1,g-1));


Сергей М.   (2008-03-24 13:45:00) [11]

И где здесь "игнорирование" пробельных символов, а также вызов  StringReplace дважды?

В упор не вижу ..


Оригинал   (2008-03-24 13:38:00) [12]

function Delims(const S: String; L: TStrings): integer;
begin
 L.Text := StringReplace(Src,'#',#13#10,[rfReplaceAll]);
 Result := L.Count;
end;


Оригинал   (2008-03-24 13:38:00) [13]

function Delims(const Src: String; L: TStrings): integer;


Сергей М.   (2008-03-24 13:02:00) [14]


> их надо игнорировать


Что значит "игнорировать" ?


> запускается дважды stringreplace


Почему именно дважды ?

Я все к тому, что сплит легко и просто реализуется средствами TStringList, если бы не кой-какие тонкости с пробельными и иными "непотребными" символами ..


operator   (2008-03-24 12:57:00) [15]

могут содержать 0..9 и буквы латинского.

так же в подстроки могут входит пробелы и символы табуляции, но их надо игнорировать. (у меня запускается дважды stringreplace, что навреное сильно тормозит систему)


Сергей М.   (2008-03-24 12:49:00) [16]

Подстроки могут содержать "пробельные" символы ? Или непечатные символы, например, CR, LF ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо