Текущий архив: 2007.09.23;
Скачать: CL | DM;
ВнизБыстрая замена части строки Найти похожие ветки
← →
@!!ex © (2007-08-23 14:13) [0]Ситуация:
Есть несколько текстовых файлов, нужно перебрать все и в каждом заменить часть данных на новые, сохранить в новый файл.
Как это быстрее сделать?
Сейчас тупо текстовый файл, читаю строку:
Заменяю кусок:
S:="исходная строка";
SubS:="лишний текст";
NewS:="новый текст";
while Pos(SubS,S)>0 do
S:=Copy(S,1,Pos(SubS,S)-1)+NewS+Copy(S,Pos(SubS,S)+Length(SubS),Length(S));
Записываю строку.
Как это делать быстрее?
← →
oldman © (2007-08-23 14:15) [1]А это можно сделать быстрее?
← →
Dimaxx © (2007-08-23 14:17) [2]А StringReplace не пробовал?
← →
Сергей М. © (2007-08-23 14:17) [3]
> Как это делать быстрее?
А в чем сомнения ?
← →
Reindeer Moss Eater © (2007-08-23 14:19) [4]Регулярными выражениями.
Если и не быстрее, то хоть намного удобнее.
← →
TUser © (2007-08-23 14:48) [5]А точно тормоза из-за этой операции?
ЗЫ. i := Pos (..., ...);
if i >= 1 then
S := ....
← →
TUser © (2007-08-23 14:51) [6]ЗЫ - это я к тому, что ты два раза pos вызываешь на каждой итерации цикла
Если все-таки надо тут ускоряться, то можно использовать поиск с препроцессингом образца, алгоритмы типа Боера-Мура и Кнута-Мориса-Пратта. Для замены - сначала SetLength строчке, потом StrCopy. Но это все мелочи, вряд ли спсет.
← →
Leonid Troyanovsky © (2007-08-23 15:04) [7]
> @!!ex © (23.08.07 14:13)
> Как это делать быстрее?
Посмотри на реализацию copyprsr.TCopyParser
--
Regards, LVT.
← →
DevilDevil © (2007-08-23 15:20) [8]если файлы быльшие, то основное время тратится не на определение позиции, а на многочисленные перевыделения и перекопированя памяти.
что стоит делать...
0) прочитать файл в память
1) создать массив позиций
2) создать массив пар <позиция, количество байт> <-- это неизменяемые символы
3) посчитать размер результируемого файла, с учётом довставленных строк
4) произвести копирование из исходного файла (памяти) в результирующий (щую память) с учётом строковых замен
5) сохранить память в файл
P.S. здесь становится сложно нахождение позиций... но слава богу существует CompareMem!
← →
@!!ex © (2007-08-23 15:27) [9]Забил, сделал все через конечный автомат.
← →
novill © (2007-08-28 10:36) [10]> [9] @!!ex © (23.08.07 15:27)
Можно узнать как?
← →
Leonid Troyanovsky © (2007-08-28 10:39) [11]
> novill © (28.08.07 10:36) [10]
> Можно узнать как?
Посмотри на реализацию copyprsr.TCopyParser
--
Regards, LVT.
← →
@!!ex © (2007-08-28 11:18) [12]> [11] Leonid Troyanovsky © (28.08.07 10:39)
Не. Я через свой старый парсер делал, он ближе и роднее. :)
Страницы: 1 вся ветка
Текущий архив: 2007.09.23;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.046 c