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

Вниз

Быстрая замена части строки   Найти похожие ветки 

 
@!!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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.042 c
3-1179570100
VitAngel
2007-05-19 14:21
2007.09.23
Цветные записи в DBGrid


15-1187895945
Leon25
2007-08-23 23:05
2007.09.23
Русская справка


15-1187797221
Неудачник
2007-08-22 19:40
2007.09.23
Программисты – это армия физиков-неудачников


2-1188227789
неискушенный
2007-08-27 19:16
2007.09.23
что это за объект - TAtom?


4-1174663451
Углук
2007-03-23 18:24
2007.09.23
Как не давать запуститься некоторой программе?





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