![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Большие *.тхт [D7, XP]
Данил.Ялта © (2006-12-12 08:18:00)У меня есть текстовый файл, размером не больше 10 мегабайт. Помогите нормально реализовать три функции:
1) получить из этого файла строку символов, начинающуюся с i и длиной L (
L<5000)
2) вырезать из этого файла какой то участок
3) вставить в каком нибудь месте файла кусок текста
==
Помогите, потому что единственное, что мне приходит в голову, это весь file читать в array of char
Игорь Шевченко (2006-12-12 13:17:00) [1]AndreyRu (12.12.06 13:02) [16]
Где бы взять столько времени...
AndreyRu (2006-12-12 13:02:00) [2]Реализуй чтение файла старым добрым способом!
....
....
private
a : array of string;
....
....
var
f : TextFile;
FSize, i : Cardinal;
tmp : string;
begin
AssignFile(f, FileName); //FileName - Имя твоего могучего файла
Reset(f);
fSize := FileSize(f); //Размер файла
while not Eof(f) do
begin
ReadLn(f, tmp);
SetLength(a, Length(a)+1); //величиваем размерность массива на 1
a[Length(a)-1] := tmp;
end;
CloseFile(f);
//Все массив строк получили теперьможно над ними работать.
> 1) получить из этого файла строку символов, начинающуюся
> с i и длиной L (
> L<5000)
> 2) вырезать из этого файла какой то участок
> 3) вставить в каком нибудь месте файла кусок текста
1) Для копирования части строки предусмотренна функция Copy
Copy(Строка, Начало, Длинна);
s := a[n]; //n-Номер строки
i := 5; //Номер символа с которого начинается наша строка
l := 20; //Длинна нашей строки;
Res := copy(s, i, l); //Все переменная Res содержит нужный кусок строки.
2) Для вырезки куска строки есть процедура Delete
Delete(Строка, Начало, Длинна);
i := 5; //Номер символа с которого начинаем вырезать
l := 20; //Длинна
a[n]; //Строка нашего массива, где n-Номер строки
Delete(a[n], i, l);
3) s := a[n]; //n-Номер строки
i := 5; //Номер символа с которого начинается вставка промежуточного текста.
Res := copy(s, 1, i) + 'ЛЮБОЙ ТЕКСТ' + copy(s, i+1, Length(s));
a[n] := Res; //Все строка обновленна
Сохраняем обратно
var
f : TextFile;
s : string;
i : integer;
begin
AssignFile(f, FileName); //FileName - Имя файла в который сохраняем
Rewrite(f);
for i := 0 to Length(a)-1 do
begin
s := a[i];
WriteLn(f, s);
end;
CloseFile(f);
end;
Все..
MetalFan (2006-12-12 12:26:00) [3]зачем невидимый TListBox??? чем StringList не угодил?
Игорь Шевченко (2006-12-12 12:21:00) [4]Gydvin © (12.12.06 11:50) [13]
Типа ответ в стиле delphimaster
Gydvin (2006-12-12 11:50:00) [5]
> Игорь Шевченко © (12.12.06 11:20) [10]
Типа шутка? )))
Игорь Шевченко (2006-12-12 11:26:00) [6]Dmitrij_K (12.12.06 11:24) [11]
Это не для начинающих
Dmitrij_K (2006-12-12 11:24:00) [7]
> Игорь Шевченко © (12.12.06 11:20) [10]
> Единственный метод чтения текстовых файлов в Delphi, это
> загрузка их в TListBox. Если визуализация не нужна - в невидимый
> TListBox
Не единственный, еще есть Tmemo, Trichedit. Еще можно установить на компьютер MS Word и грузить с помощью TWordApplication+TWordDocument
:)
Игорь Шевченко (2006-12-12 11:20:00) [8]Думкин © (12.12.06 11:09) [9]
Единственный метод чтения текстовых файлов в Delphi, это загрузка их в TListBox. Если визуализация не нужна - в невидимый TListBox
Думкин (2006-12-12 11:09:00) [9]
> Игорь Шевченко © (12.12.06 10:58) [7]
? Кто-то говорил о визуализации? Чем TStringList не устраивает?
Насоветуют...
Dmitrij_K (2006-12-12 11:04:00) [10]
> размером не больше 10 мегабайт
TStringList нормально с этим справиться.
Игорь Шевченко (2006-12-12 10:58:00) [11]Грузить в TListBox и не париться. Все равно в Delphi других методов чтения текстовых файлов нету.
Насоветуют...
Barloggg (2006-12-12 09:42:00) [12]да, как массив букв с загрузкой поштучно это долго. это очень долго.
Нужно загружать как можно большим куском и уже в памяти проводить анализ. Тогда хорошо.
Так что либо уже указанный blockread куском в массив либо тоже уже указанный FileStream куском в массив.
Думкин (2006-12-12 08:35:00) [13]
> Данил.Ялта (12.12.06 08:21) [1]
Почему медленно? ты попробал, раз утверждаешь?
Думкин (2006-12-12 08:26:00) [14]Можно и обычный string - тянет в легкую. Единственно изменять надо аккуратно - тут могут и тормоза вылезти. Или TstringList.
Elen (2006-12-12 08:24:00) [15]
> о если так делать, то из file of char очень медленно будут
> данные читаться :-(
Смотря как читать. Например BlockRead очень быстрая функция, а анализ содержимого уже в памяти проводи. Ну может еще подкачку придется делать
Данил.Ялта (2006-12-12 08:21:00) [16]Но если так делать, то из file of char очень медленно будут данные читаться :-(
Elen (2006-12-12 08:21:00) [17]
> это весь file читать в array of char
Лучше в TFileStream. Я правда не знаю потянет ли TListBox такие файлы, но можно и его попробвать.