Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.051 c
2-1206196743
San1
2008-03-22 17:39
2008.04.20
перекрытие Create


15-1204791647
DiamondShark
2008-03-06 11:20
2008.04.20
Ура! Это всё-таки случилось.


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


2-1206598873
zdm
2008-03-27 09:21
2008.04.20
Отслеживание исполнения


2-1206545585
MikeLevinN
2008-03-26 18:33
2008.04.20
far





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский