![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимальный способ парсинга строк. [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 ?