Форум: "Начинающим";
Текущий архив: 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.042 c