Вверх ↑
Ответов: 16884
Рейтинг: 1239
#1: 2010-09-11 09:38:49 ЛС | профиль | цитата
nesco, насчет тормозов в Pos ты прав только частично.
Pos бежит себе по строке, как в том анекдоте[flood]
Анекдот писал(а):
Съездил грузин в гости в Москву. Вернулся. Ну все друзья
- Рассказывай, как в Москве.
- Большая. Людей много. На балет ходил.
- А балет, это что ?
- Понимаешь. Сцена. Он один, а женщин много. Музыка. Он женщину поднял, понюхал, бросил. Поднял, понюхал, бросил. Поднял, понюхал и понес со сцены
[/flood]совпало, вернул номер позиции

Ныряем в теорию.
Вот примитивно прокомментировал GetTok

#pas
function GetTok(var s:string; const c:char):string; // в s получаем указатель на исходную строку и символ
var p:integer;
begin
p := Pos(c,s); // получаем позицию вхождения
if p > 0 then // есть вхождение
begin
Result := Copy(s,1,p-1); // создаётся новая строка с указателем в Result и длиной p-1
if p = Length(s) then // проверяем на конец строки
s := ' // Да, конец - переносим признак конца строки
// на место первого символа
// и указатель на пустую строку автоматом уничтожается
else Delete(s,1,p); // не конец: СМЕЩАЕМ (ПЕРЕЗАПИСЫВАЕМ) ВСЮ СТРОКУ от найденого Pos до конца строки-
//вот это основной тормоз. Указатель на строку отстается прежний
end
else Result := s; //нет вхождения. В Result значение указателя исходной строки.
end;
Delete gри длинной строке тормоз ещё тот.
Вывод:
1. Вместо Pos применить PosEx
2. Исключить Delete
3. Применить только Copy (никуда не денешься - результат то нужен. )

Или отказаться от парсинга текста длинной в 400 Mb


карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0