Вверх ↑
Этот топик читают: Гость
Ответов: 817
Рейтинг: 52
#1: 2014-01-09 11:48:16 ЛС | профиль | цитата
Добрый день!
Есть большой текстовый файл (670 Мб - 153754280 строк)
Необходимо пробежаться по всему файлу и заменить слово/группу слов (наверное правильнее это называется "подстрока")

Как это сделать на маленьком файлике (загрузив его в память) я знаю, сделал.
А вот как пробежаться по файлу не загружая его весь в память не знаю.

Прошу подсказать на уровне концепции или примером.
карма: 1

0
vip
#1.1контекстная реклама от партнеров
Ответов: 757
Рейтинг: 111
#2: 2014-01-09 11:53:33 ЛС | профиль | цитата
Кхмммм!!!
Твоя же тема
карма: 1

0
Ответов: 817
Рейтинг: 52
#3: 2014-01-09 11:56:29 ЛС | профиль | цитата
Моя, но там все просто, только перебор, а теперь еще и замена

карма: 1

0
Гость
Ответов: 17029
Рейтинг: 0
#4: 2014-01-09 20:12:49 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2020-03-01 12:53:40
карма: 0

0
Ответов: 817
Рейтинг: 52
#5: 2014-01-10 10:21:12 ЛС | профиль | цитата
116.228.55.217, Спасибо, но даже на уровне концепции я не понимаю принципа работы
Как я понимаю эту схему
1. Открываем файл в виде потока на запись и чтение
2. Начинаем поиск подстроки в указанном файле
3. Если не находит, то сохраняем данные в поток
4. Если находим, то делаем подмену и опять записываем в поток.

п.3 - Я не понимаю что сохраняем и для чего сохраняем если ничего не найдено.
п.4 - Куда записывает? Как происходит понимание, что надо сохранять не в начало, не в конец, а именно в замен найденного?

Вот, немного изменил вашу схему под свои нужды и происходит "Runtime error 32 at 000C369"
code_32788.txt
карма: 1

0
файлы: 1code_32788.txt [1KB] [229]
Ответов: 4340
Рейтинг: 677
#6: 2014-01-10 12:36:59 ЛС | профиль | цитата
С поиском в потоке и получением позиции может помочь модифицированный DataToFile.
1) Если длина заменяемого текста равна длине искомого - прямо пишем там же в поток
2) Если длина отличается, самый простой вариант:
- составить список позиций найденного текста в потоке
- создать новый файл
- записать в него данные из старого файла от начала до позиции №1
- записать в него заменяющий текст
- записать текст из старого файла с позиции (№1+длина искомого текста) до позиции №2
- повторять предыдущие два пункта до конца старого файла

Теоретически замену можно писать в тот же файл, но алгоритм значительно сложнее (предварительное сохранение в память фрагмента, который может быть перекрыт заменяемым текстом и т.п.)
карма: 25

0
Разработчик
Ответов: 25681
Рейтинг: 2087
#7: 2014-01-10 12:44:19 ЛС | профиль | цитата
SharedStream, второй пример. Работает очень быстро с файлами большой длины, гораздо больше 4 Гб. Работа с Memory Mapped File (MMF) -- это самый быстрый из существующих способов доступа к файлу, быстрее него ни одна файловая операция не работает в системе, тк все они используют MMF, в том или ином качестве
карма: 20

0
Ответов: 16884
Рейтинг: 1237
#8: 2014-01-10 14:04:27 ЛС | профиль | цитата
-= DriveR =-, а протестируй на своём файле вот это:
code_32789.txt
карма: 24
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
файлы: 1code_32789.txt [2.3KB] [349]
Голосовали:-= DriveR =-
Гость
Ответов: 17029
Рейтинг: 0
#9: 2014-01-10 15:22:30 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2020-03-01 12:53:40
карма: 0

0
Ответов: 817
Рейтинг: 52
#10: 2014-01-11 13:53:44 ЛС | профиль | цитата
116.228.55.217,
спасибо большое за пример, теперь стало понятнее

Tad,
Опробовал твою схему и она отработала даже быстрее чем на компонентах HiAsm,
однако твоя схема не дружит с русскими буквами.
В моем файле есть подстрока вида "(RX)" хотел заменить ее на "(ЧтениеВыполнение)", в итоге получилось "(+++++++++++++++)"
карма: 1

0
Ответов: 16884
Рейтинг: 1237
#11: 2014-01-11 15:01:50 ЛС | профиль | цитата
-= DriveR =- писал(а):
однако твоя схема не дружит с русскими буквами.
У меня прекрасно меняет латынь на русские и наоборот.
карма: 24
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 25681
Рейтинг: 2087
#12: 2014-01-11 15:43:28 ЛС | профиль | цитата
Tad писал(а):
протестируй на своём файле вот это

Странно, почему у нас не используется в пакете Win методы самого Делфи для файловых операций Кто-то же из ОО должен же это знать.
Или думали, что KOL-ские методы быстрее, а кто тестировал
карма: 20

0
Ответов: 16884
Рейтинг: 1237
#13: 2014-01-11 19:19:06 ЛС | профиль | цитата
nesco, вообще-то много странного.
карма: 24
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 4666
Рейтинг: 516
#14: 2014-01-11 20:09:56 ЛС | профиль | цитата
Tad писал(а):
nesco, вообще-то много странного.

вот тут согласен, "Отстаём понимаешь ли от Америки Догнать и перегнать "
карма: 6

0
Ответов: 817
Рейтинг: 52
#15: 2014-01-13 13:37:59 ЛС | профиль | цитата
Tad писал(а):
У меня прекрасно меняет латынь на русские и наоборот.

Извиняюсь, это я слепой.
У меня файлик изначально в досовской кодировке.
Спасибо, отлично работает.
116.228.55.217, Зарегистрировался бы, уважаемый, я бы плюсанул тебе, а пока только на словах могу сказать Спасибо за разъяснения, очень доходчиво объяснил.
карма: 1

0
15
Сообщение
...
Прикрепленные файлы
(файлы не залиты)