nagon.net - бесплатная поставка трафика на ваши сайты
Логин:
Пароль:
Регистрация





Убрать рекламу с сайта чтобы не мешала!

Чтение больших файлов Delphi. Чтение большого файла XML на Делфи, TXMLDocument

Что делать если нужно прочитать большой текстовый файл на Delphi?
Файл по размеру может превышать несколько сотен мегабайт.
И совершенно не важно в каком он формате.
В моем случае нужно прочитать файл XML размером 900 мб., разбить его на блоки.
Естественно если воспользоваться компонентом TXMLDocument результат будет плачевный, во первых зависнет компьютер, во вторых программа вылетит с сообщением о нехватки памяти.
Другая идея использовать TStringList, но результат будет еще плачевней, может потребоваться перезагрузка компьютера, потому что комп зависнет окончательно.

Что же делать?
В интернете я не нашел грамотного решения.

Давайте покажу как я решил эту проблему.

Во первых файл нужно читать не полностью, а построчно.

Во вторых все это дело должно работать в цикле.

На форму я закинул следующие компоненты:


Memo1: TMemo;
Button1: TButton;
Label1: TLabel;


При нажатии на кнопку пишем следующий код:


procedure TForm1.Button1Click(Sender: TObject);
var
F: TextFile;
Row: Integer;
S: string;
buf:string;
key:boolean;
begin
AssignFile(F, 'BIG_FILE.xml');
{try
Rewrite(F); // открытие для записи
for Row := 1 to 1000 do
begin
WriteLn(F, 'xxx ', Row);
end;
finally
CloseFile(F);
end;}
// Чтение
try
//WriteLn('Test Reading...');
Reset(F); // открытие для чтения
//for Row := 1 to 10000 do
Row:=0;
key:=false;
while not Eof(F) do
begin
ReadLn(F, S);
if Pos('<codetag',S)<>0 then
begin
key:=true;
buf:='';
end;
if Pos('</codetag',S)<>0 then
begin
buf:=buf+S+#13#10;
key:=false;
//выполянем действия с xml блоком
//тут нужно написать свой обработчик для buf
Memo1.Text:=buf;
Row:=Row+1;
end;

if key then
begin
buf:=buf+S+#13#10;
end;
Label1.Caption:=IntToStr(Row);
Application.ProcessMessages;

//if Row>100 then exit;
end;
finally
CloseFile(F);
end;

end;


Собственно при нажатии на кнопку данный код проходится по всему файлу в цикле.
Собирает в переменную buf блок

<codetag>тут другие теги и символы</codetag>

Функцию конечно требуется дописать, а точнее когда в buf появляется блок, его нужно обработать по своему усмотрению.
В общем то так все довольно просто.
Кстати в других языках (например в PHP) нужно делать так же.


Вас зовут:

Ваш комментарий:


Код на картинке: