Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.08;
Скачать: CL | DM;

Вниз

Разбить текстовый файл   Найти похожие ветки 

 
Viktop   (2005-12-19 21:15) [0]

Как можно разбить текстовый файл на несколько равных (приблизительно) частей. Например, по 10 кило.


 
Eraser ©   (2005-12-19 21:18) [1]


> Viktop   (19.12.05 21:15)

С помощью TFileStream и его методов Read и Write.


 
Viktop   (2005-12-20 07:13) [2]

Что-то типа этого
var
f:TFileStream;
buf: array[0..maxInt] of char; // Буфер, для хранения прочитанных данных
begin
f:= TFileStream.Create(‘c:\filename.txt’, fmOpenReadWrite);
f.Seek(10240, soFromCurrent);
f.Read(buf, 10240);
f.Free;
end;

Вроде бы должно работать. Сам не проверял. Я праквильно посчитал 10240 символов - 10 кило?


 
Viktop   (2005-12-20 21:05) [3]

Написал такой код
[quote]procedure TfmMain.Button1Click(Sender: TObject);
const
 sz = 20480;
var
 f, f2: TFileStream;
 fl: TStringList;
 buf: array[0..sz] of char;
 i: Integer;
begin
 i := 0;
 f := TFileStream.Create("c:\1.txt", fmOpenReadWrite);
 fl := TStringList.Create();
 while f.Position <= f.Size do
 begin
   f.Seek(sz, soFromCurrent);
   f.Read(buf, sz);
   fl.Text := buf;
   fl.SaveToFile("C:\1_" + IntToStr(i) + ".txt");
   Inc(i);
 end;
 f.Free;
end;[/quote]
Но почему-то не совсем правильно работает. Файл с именем 1_0.txt содержит текст не с самого начала, а последний файл не до конца.
Текст в кодировке DOS. Т.е., если посмотреть суммарный размер полученных файлов, то он будет в 2 раза меньше оригинала


 
Eraser ©   (2005-12-20 21:19) [4]


> Viktop   (20.12.05 21:05) [3]

Читай ещё раз справку по TFileStream и по TStringList. К чему тут TStringList вообще не понятно!
Никаких Seek не нужно. Можно обойтись двумя TFileStream.
Примерно так (не проверял, возможны ошибки)

fs1 := TFileStream.Create("c:\main.txt", fmOpenReadWrite);
fs1.Position := 0;
while fs1.Position <= f.Size do
begin
  fs2 := TFileStream.Create("IntToStr(i) + ".txt", fmCreate);
  fs2.CopyFrom(fs1, sz);
  fs2.Free;
  Inc(i);
end;
fs1.Free;


 
Viktop   (2005-12-21 04:56) [5]

Спасибо. Маленько подправил и получил:
procedure TfmMain.Button3Click(Sender: TObject);
const
 sz = 20480;
var
 fs1, fs2: TFileStream;
 i: Integer;
begin
 i := 0;
 fs1 := TFileStream.Create("c:\main.txt", fmOpenReadWrite);
 fs1.Position := 0;
 while fs1.Position <= fs1.Size do
 begin
   fs2 := TFileStream.Create(IntToStr(i) + ".txt", fmCreate);
   if fs1.Size - fs1.Position < sz then
   begin
     fs2.CopyFrom(fs1, fs1.Size - fs1.Position);
     fs2.Free;
     fs1.Free;
     exit;
   end
   else
     fs2.CopyFrom(fs1, sz);
   fs2.Free;
   Inc(i);
 end;
 fs1.Free;
end;

Он, скорее всего не совсем верен (условие), но иначе выдавалась ошибка



Страницы: 1 вся ветка

Текущий архив: 2006.01.08;
Скачать: CL | DM;

Наверх




Память: 0.45 MB
Время: 0.008 c
2-1134854507
Костя
2005-12-18 00:21
2006.01.08
Автозагрузка


14-1134508044
Kerk
2005-12-14 00:07
2006.01.08
Cyber Underground Community VS Terrorism


2-1134926705
Silica
2005-12-18 20:25
2006.01.08
Объясните, пожалуйста


14-1134548476
msguns
2005-12-14 11:21
2006.01.08
О газе и демократии или откуда ноги растут


2-1135228511
RUBEY
2005-12-22 08:15
2006.01.08
Встроенные компоненты





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