Главная страница
    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
14-1134551437
Narik
2005-12-14 12:10
2006.01.08
Удаление папки...


2-1134919368
newhite
2005-12-18 18:22
2006.01.08
Бешеный курсор


2-1134851049
Scripl
2005-12-17 23:24
2006.01.08
Программа заставка


14-1134438087
fester
2005-12-13 04:41
2006.01.08
ТАУ


4-1131179027
Yus
2005-11-05 11:23
2006.01.08
FileTimeToDosDateTime





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