Pos бежит себе по строке, как в том анекдоте[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;
Вывод:
1. Вместо Pos применить PosEx
2. Исключить Delete
3. Применить только Copy (никуда не денешься - результат то нужен. )
Или отказаться от парсинга текста длинной в 400 Mb