Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с текстовыми файлами больших размеров. 
:(
    Опции темы
-----DelphiMan
Дата 8.4.2004, 10:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Меня интересует как имея текстовый фаил
найти внём нужную ЛИНИЮ по 10-ти начальным символам строки
и совершить над этой линией следующие действия:

1) Заменить
2) Переименовать
4) Сместить позицию (Вверх /Вниз)

Конечно это можно былобы сделать открыв фаил в Какомнить Memo или RichEdite
но поскольку размер файла очень большой то на его загрузку и сохранение
уйдёт куча времени.
  Вверх
x77
Дата 8.4.2004, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



FileSeek, BlockRead, BlockWrite.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
-----DelphiMan
Дата 8.4.2004, 11:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну и как задать для FileSeek нужную строку ?
  Вверх
x77
Дата 8.4.2004, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



а что, размер линий разный?

тогда

for i := 1 to 10 do
ReadLn (f, s);

после окончания цикла в s будет десятая строка. меняем её как нам надо. потом:

for i := 1 to 9 do
ReadLn (f, s);
WriteLn (f, s);



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
x77
Дата 8.4.2004, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



а, торможу. тебе ж надо не десятую, а по первым символам.

читай строки, для каждой делай Pos.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
-----DelphiMan
Дата 8.4.2004, 16:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну и как используя WriteLn сделать запись скажем
в серидине файла?
  Вверх
x77
Дата 8.4.2004, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



делаешь в цикле ReadLn (f, s), пока не выполнится какое-то условие (не наступит "середина файла", к примеру), а потом делаешь WriteLn.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Alex
Дата 8.4.2004, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



А можно узнать, что вы называете большим файлом?


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
RA
Дата 8.4.2004, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Цитата(x77 @ 8.4.2004, 17:09)
делаешь в цикле ReadLn (f, s), пока не выполнится какое-то условие (не наступит "середина файла", к примеру), а потом делаешь WriteLn.

Ошибка будет.
Добавлено @ 21:02
Цитата(alex @ 8.4.2004, 17:47)
А можно узнать, что вы называете большим файлом?

Как я понял это когда размер файла больше Оперативной памяти
PM   Вверх
x77
Дата 9.4.2004, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



RAdmin, ты имеешь в виду Reset/Rewrite? не будет ;)



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
maxim1000
Дата 9.4.2004, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 4
Всего: 110



открываем два файла (один из них исходный, другой - для результата)
читаем один по кусочкам
вносим изменения
пишем резуьтат во второй файл
Добавлено @ 15:48
кстати, в виду больших объемов информации не помешало бы пользоваться системными функциями работы с файлами (я тестов не проводил, но по идее они должны быть быстрее)


--------------------
qqq
PM WWW   Вверх
Alex
Дата 9.4.2004, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Нет ну всетаки какой файл по размеру?


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
x77
Дата 9.4.2004, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



alex-co, действительно smile.gif вдруг там вообще без file-mapping'а не обойдёшься. кстати, для действительно больших файлов - на пару гигов - оптимальный вариант.



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
RA
Дата 9.4.2004, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Цитата(x77 @ 9.4.2004, 12:41)
RAdmin, ты имеешь в виду Reset/Rewrite? не будет ;)

Ага, ибо либо одно либо другое.


Если Rewrite то придётся весь фаил перезаписывать, а прикинь он весить будет около гига, ну а ресет сам знаешь что даёт smile.gif .


Как вот такой вариант ?
Код


procedure FileReplaceString(const FileName, searchstring, replacestring: string);
var
 fs: TFileStream;
 S: string;
begin
 fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
 try
   SetLength(S, fs.Size);
   fs.ReadBuffer(S[1], fs.Size);
 finally
   fs.Free;
 end;
 S  := StringReplace(S, SearchString, replaceString, [rfReplaceAll, rfIgnoreCase]);
 fs := TFileStream.Create(FileName, fmCreate);
 try
   fs.WriteBuffer(S[1], Length(S));
 finally
   fs.Free;
 end;
end;






PM   Вверх
x77
Дата 9.4.2004, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



RAdmin, ты считаешь, что твой вариант будет нормально себя чувствовать при весе файла около гига? smile.gif кстати, объявление string соответствует AnsiString, а у него 2 гига - вообще предел.

нет, народ, для действительно больших файлов надо либо делать файл-маппинг, либо вообще читать напрямую диск.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
RA
Дата 10.4.2004, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



x77 ТормоjЮ hehe.gif
PM   Вверх
Alex
Дата 10.4.2004, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



У меня такое впечатление, что ответ на вопрос интересует всех кроме автора вопроса smile.gif


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
------DelphiMan
Дата 10.4.2004, 18:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да нет я тут слежу за базаром но пока никто толком не ответил.

а насчёт большого размера то около гигабайта фаил.
  Вверх
Alex
Дата 10.4.2004, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Если файл у тебя не превышает 2 гигов, то любой из выше приведенных способов тебе подойдет


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
RA
Дата 11.4.2004, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Да ты что, переписывать гигабайт этож вообще П****
PM   Вверх
p0s0l
Дата 11.4.2004, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Что значит:
1) заменить
2) переименовать

Чем они отличаются ?

и куда делось 3) ?

Если имеется в виду, что нужно заменить строку типа:
"abcdefg" на "klmnopqwertyiotiw", т.е. длина найденной строки может измениться, то это значит, что всю оставшуюся часть файла надо перемещать. Для больших файлов это будет убийство. Единственный приемлимый вариант в этом случае - создавать второй файл и в него писать новую инфу, а потом первый удалить...



--------------------
С уважением, г-н Посол.
PM   Вверх
------DelphiMan
Дата 12.4.2004, 11:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Посол, фаил текстовый так что ущерба не будет.
  Вверх
x77
Дата 12.4.2004, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



да какая нахрен разница, текстовый он или нет. ты что, думаешь, что текстовый файл храниться также, как и выводится - по строчкам? это та же последовательность байтов, в которой периодически встречаются символы возврата картеки и сдвига строки - #13#10. то, что ты видишь по строчно, на самом деле представляет собой непрерывную последовательность символов. в твоём случае, скорее всего, фрагментированную. и эта последовательность будет увеличиваться/уменьшаться.

я бы делал файл-маппинг. по крайней мере, работать будет относительно быстро. но поскольку этот "базар" ты "толковым" не считаешь, сделай, как советует p0s0l - пиши в новый файл. других вариантов я не вижу. работать стандартно, через те же stream'ы, - самоубийство.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0962 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.