Классическая задача парсинга: имеется текстовый файл, размер очень большой, в память не загружается ( TStringList.LoadFromFileAnsi(), как и ожидалось, выдаёт Out of Memory ). Необходимо читать данные построчно.
Попробовал так:
const
BufSize = 1;
procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
FileName : string;
TextFile : TFileStream;
buf: Char;
tmpLine: string;
begin
FileName := ExtractFilePath( Application.ExeName ) + 'test.txt';
TextFile := TFileStream.Create( FileName, fmOpenRead );
TextFile.Seek(0,soFromBeginning);
while not (TextFile.Position >= TextFile.Size) do
begin
// считать строку
tmpLine := '';
while not (TextFile.Position >= TextFile.Size) do begin
TextFile.Read( buf, BufSize );
if buf = #13 then
begin
TextFile.Read(buf, BufSize ); // считать #10
break;
end;
tmpLine := tmpLine + buf;
end;
ShowMessage('Строка: '+tmpLine);
end;
TextFile.Free;
end;
Но оказалось, что метод TFileStream.Read передаёт в строку байт и тут же его преобразует в Юникод, что приводит к неверным результатам.
Визуальное программирование:
блог и
телеграм-канал.