Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.20;
Скачать: CL | DM;

Вниз

Оптимальный способ парсинга строк.   Найти похожие ветки 

 
operator ©   (2008-03-24 12:44) [0]

Всем привет,
есть срока вида:
подстрока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;


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


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

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


 
operator ©   (2008-03-24 12:57) [2]

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

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


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


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


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


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


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

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


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

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) [5]

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


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

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

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


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

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

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

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

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


 
operator ©   (2008-03-24 13:55) [8]


>  StringReplace дважды ?
>


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


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


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


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


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


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

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

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


 
Reindeer Moss Eater ©   (2008-03-24 14:17) [10]

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


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


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


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


 
Reindeer Moss Eater ©   (2008-03-24 14:29) [12]

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


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

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


 
trubin ©   (2008-03-24 15:11) [14]


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


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


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

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


 
Anatoly Podgoretsky ©   (2008-03-24 20:21) [16]

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

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



Страницы: 1 вся ветка

Текущий архив: 2008.04.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
11-1188137808
Jimmy Lee
2007-08-26 18:16
2008.04.20
почему размер DemoEmpty у меня больше, чем в примере?


15-1204390811
Ник
2008-03-01 20:00
2008.04.20
Потерял "горячие" клавиши :(


2-1206682211
dumka
2008-03-28 08:30
2008.04.20
QReport


15-1204652410
Dmitry S
2008-03-04 20:40
2008.04.20
AV непонятный


15-1205062287
NL
2008-03-09 14:31
2008.04.20
mkv - что за расширение?