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

Вниз

Найти и заменить все строки в подстроке.   Найти похожие ветки 

 
Still Swamp   (2008-08-25 16:05) [0]

Всегда юзал собственную функцию StrTran(ASourse:string; AMask:string; AReg:string); написанную во времена BP. Она в строке Source все подстроки AMask заменяет на AReg. Сейчас заметил что она работает не быстро. Решил переписать, однако на всяк случай хочу узнать, наверняка есть что нить подобное. Подскажите.


 
Medbe}I{onok XML ©   (2008-08-25 16:08) [1]

http://regexpstudio.com/RU/TRegExpr/Help/TRegExpr_Interface.html

function ReplaceRegExpr (const ARegExpr, AInputStr, AReplaceStr : string;
AUseSubstitution : boolean = False) : string;


 
Still Swamp   (2008-08-25 16:16) [2]

Ок. Спасибо. Забыл уточнить что спрашивал о стандартном средстве Delphi. Чужой код в данном случае к сожалению использовать не смогу.


 
Medbe}I{onok XML ©   (2008-08-25 17:22) [3]

Тогда в чем вопрос? Продолжай ездить на собственном лисапете.


 
Vlad Oshin ©   (2008-08-25 17:29) [4]

стандартную

function StringReplace(const S, OldPattern, NewPattern: string;
 Flags: TReplaceFlags): string;

если на asme попытаться переписать для скорости


 
Loginov Dmitry ©   (2008-08-25 22:58) [5]

> если на asme попытаться переписать для скорости


хоть на чем перепиши, все-равно тормознее врядли сделаешь


 
TStas ©   (2008-08-25 23:22) [6]

Но можно же, если строка очень длинная, сначала посчитать все вхождения, потом получить новую длинну, ну и сделать замены. Это должно быстро работать. Действительно, StringReplace для длинных строк тромозит заметно.


 
Loginov Dmitry ©   (2008-08-25 23:58) [7]

> Но можно же, если строка очень длинная, сначала посчитать
> все вхождения, потом получить новую длинну, ну и сделать
> замены.


Если новое строковое значение по длине не превышает старого, то можно сделать за один проход цикла без предварительных подсчетов. Если превышает, то можно либо после подсчета установить длину итоговой строки, либо также за один проход делать, но устанавливать длину строки с запасом. В любом случае по сравнению с StringReplace() получим выигрыш в скорости в десятки/сотни/тысячи (в зависимости от объема данных) раз.


 
Still Swamp   (2008-08-26 12:04) [8]

За StringReplace спасибо. То что надо было. Но пока ждал ответа написал лисапед.

На одном и том же тексте.

StringReplace с регистрами 1625ms
StringReplace без регистров 422ms
StrTran  без регистров 94ms

function StrTran(const Str:string; const StrIn:string; const StrOut:string):string;
var
StPs: integer;
StRes:WideString;
i:integer;
iLast:integer;
l:integer;
lIn:integer;
begin
Result:="";
i:=1;
iLast:=i;
l:=Length(Str);
lIn:=Length(StrIn);
while (i<l)and(i>0) do begin
 i:=PosEx(StrIn, Str, i);
 if i>0 then begin
  Result:=Result+Copy(Str, iLast, i-iLast)+StrOut;
  i:=i+lIn;
  iLast:=i;
 end;
end;
Result:=Result+Copy(Str, iLast, l-iLast+1);
end;


 
brother ©   (2008-08-26 12:07) [9]

> StringReplace с регистрами 1625ms
> StringReplace без регистров 422ms
> StrTran  без регистров 94ms

где и как засечены ms?


 
Amoeba ©   (2008-08-26 12:55) [10]

Это смотрели?
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1059


 
TStas ©   (2008-08-26 20:48) [11]

Да, конечно. На форуме в статьях висит очень хорошая статья на эту тему "Динамические структуры данных", где популярно объясненно, что самое жуткое, что можно сделать с длинной строкой это VeryLongStr := VeryLongStr + "Что-то прибавляется". Причём, чем длиннее строка, тем сильнее такая кнострукция тормозит.

> Result:=Result+Copy(Str, iLast, l-iLast+1); - Вот это оно и есть. Да ещё и в цикле :(


 
Still Swamp   (2008-08-26 21:53) [12]

brother. а не важно. Данные в общем можно считать относительными друг друга.
Вообще p4. Текст 10кб около 1000 замен одного символан на три, и так 10000тыс раз.

TStars. Нет предела совершенству. В общем то не смотря ни на что, я таки начал юзать StringReplace, так как там есть учет регистра а мне писать лениво. Так что в моем случае на счет строк под которые динамически память отводится можно расслабиться. Я понимаю что можно было выделить буфер, потом заполнять его, расширяя блоками, но в моем случае смысла нет. StringReplace меня вполне удовлетворил.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2009.10.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
2-1250078861
Lexus_samara
2009-08-12 16:07
2009.10.18
Как программно удалить одну строку из текстового файла(txt)?


2-1249906240
abun
2009-08-10 16:10
2009.10.18
Фильтрация массива чисел от шума


2-1250492579
studenttgata
2009-08-17 11:02
2009.10.18
Определение градиента.


2-1250318652
Константинов
2009-08-15 10:44
2009.10.18
работа с файлами *.adt и *.adi


15-1249654837
девушка
2009-08-07 18:20
2009.10.18
Кого-нибудь дергали в связи с 152-ФЗ ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский