Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.027 c
2-1188310061
sinoptikmoscow
2007-08-28 18:07
2007.09.23
сравнение строк


15-1187850060
БарЛог
2007-08-23 10:21
2007.09.23
Linux, Fedora6, Grub, смена загрузки ОС по умолчанию


2-1188445088
Abcdef123
2007-08-30 07:38
2007.09.23
Проблема открыть таблицу в Exclusive режиме


3-1179604970
Котюргин
2007-05-20 00:02
2007.09.23
Запрос с параметрами


2-1188203037
DimOk
2007-08-27 12:23
2007.09.23
Получение почты в Delphi