Добрый день!
Есть большой текстовый файл (670 Мб - 153754280 строк)
Необходимо пробежаться по всему файлу и заменить слово/группу слов (наверное правильнее это называется "подстрока")
Как это сделать на маленьком файлике (загрузив его в память) я знаю, сделал.
А вот как пробежаться по файлу не загружая его весь в память не знаю.
Прошу подсказать на уровне концепции или примером.
Этот топик читают: Гость
Ответов: 817
Рейтинг: 52
|
|||
карма: 1 |
|
Ответов: 758
Рейтинг: 112
|
|||
карма: 1 |
|
Ответов: 817
Рейтинг: 52
|
|||
Моя, но там все просто, только перебор, а теперь еще и замена
|
|||
карма: 1 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 6 раз(а), последний 2021-06-24 08:01:14 |
|||
карма: 0 |
|
Ответов: 817
Рейтинг: 52
|
|||
116.228.55.217, Спасибо, но даже на уровне концепции я не понимаю принципа работы
Как я понимаю эту схему 1. Открываем файл в виде потока на запись и чтение 2. Начинаем поиск подстроки в указанном файле 3. Если не находит, то сохраняем данные в поток 4. Если находим, то делаем подмену и опять записываем в поток. п.3 - Я не понимаю что сохраняем и для чего сохраняем если ничего не найдено. п.4 - Куда записывает? Как происходит понимание, что надо сохранять не в начало, не в конец, а именно в замен найденного? Вот, немного изменил вашу схему под свои нужды и происходит "Runtime error 32 at 000C369" code_32788.txt |
|||
карма: 1 |
| ||
файлы: 1 | code_32788.txt [1KB] [645] |
Ответов: 4630
Рейтинг: 749
|
|||
С поиском в потоке и получением позиции может помочь модифицированный DataToFile.
1) Если длина заменяемого текста равна длине искомого - прямо пишем там же в поток 2) Если длина отличается, самый простой вариант: - составить список позиций найденного текста в потоке - создать новый файл - записать в него данные из старого файла от начала до позиции №1 - записать в него заменяющий текст - записать текст из старого файла с позиции (№1+длина искомого текста) до позиции №2 - повторять предыдущие два пункта до конца старого файла Теоретически замену можно писать в тот же файл, но алгоритм значительно сложнее (предварительное сохранение в память фрагмента, который может быть перекрыт заменяемым текстом и т.п.) |
|||
карма: 26 |
|
Разработчик
Ответов: 26153
Рейтинг: 2127
|
|||
SharedStream, второй пример. Работает очень быстро с файлами большой длины, гораздо больше 4 Гб. Работа с Memory Mapped File (MMF) -- это самый быстрый из существующих способов доступа к файлу, быстрее него ни одна файловая операция не работает в системе, тк все они используют MMF, в том или ином качестве
|
|||
карма: 22 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
карма: 25 |
| ||
файлы: 1 | code_32789.txt [2.3KB] [825] | ||
Голосовали: | -= DriveR =- |
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 6 раз(а), последний 2021-06-24 08:01:14 |
|||
карма: 0 |
|
Ответов: 817
Рейтинг: 52
|
|||
116.228.55.217,
спасибо большое за пример, теперь стало понятнее Tad, Опробовал твою схему и она отработала даже быстрее чем на компонентах HiAsm, однако твоя схема не дружит с русскими буквами. В моем файле есть подстрока вида "(RX)" хотел заменить ее на "(ЧтениеВыполнение)", в итоге получилось "(+++++++++++++++)" |
|||
карма: 1 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
-= DriveR =- писал(а): однако твоя схема не дружит с русскими буквами. |
|||
карма: 25 |
|
Разработчик
Ответов: 26153
Рейтинг: 2127
|
|||
Tad писал(а): протестируй на своём файле вот этоСтранно, почему у нас не используется в пакете Win методы самого Делфи для файловых операций Кто-то же из ОО должен же это знать. Или думали, что KOL-ские методы быстрее, а кто тестировал |
|||
карма: 22 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
nesco, вообще-то много странного.
|
|||
карма: 25 |
|
Ответов: 5227
Рейтинг: 587
|
|||
Tad писал(а): nesco, вообще-то много странного. вот тут согласен, "Отстаём понимаешь ли от Америки Догнать и перегнать " |
|||
карма: 4 |
|
Ответов: 817
Рейтинг: 52
|
|||
Tad писал(а): У меня прекрасно меняет латынь на русские и наоборот.Извиняюсь, это я слепой. У меня файлик изначально в досовской кодировке. Спасибо, отлично работает. 116.228.55.217, Зарегистрировался бы, уважаемый, я бы плюсанул тебе, а пока только на словах могу сказать Спасибо за разъяснения, очень доходчиво объяснил. |
|||
карма: 1 |
|
15