|
Тема
|
Четене на голям текстов файл
|
|
Автор | Desso (Нерегистриран) |
Публикувано | 18.01.07 17:25 |
|
Здравейте!
Преди няколко седмици бях написал една програма, която обработва текстови файлове (в частност html), и по начало си работеше добре, докато не реших да обработя един 80Мб файл. При команда readln(...); чете коректно докато не стигне 58 ред, когато прочита хиляди редове като един единствен ред (получава се доста дълъг стринг) до края на файла и съответно четенето приключва. Ако разцепя същия файл по какъвто и да е начин, при размер на парчето под 24 Мб четенето си е коректно. Въпросът е какво се случва с Делфито и как да оправя програмата.
Файлът е създаден с помощта на скрипт и представлява таблица от база данни в HTML формат.
| |
Тема
|
Re: Четене на голям текстов файл
[re: Desso]
|
|
Автор |
Mixy (@#$%^) |
Публикувано | 18.01.07 21:52 |
|
С кое Делфи си? Само за този тип текстови файлове ли се държи така или и за всички останали >24 МВ? В какво четеш - масив, StringList? Как управляваш паметта? Какво точно има на реда, след който програмата се чупи?
Mixy
| |
Тема
|
Re: Четене на голям текстов файл
[re: Desso]
|
|
Автор |
vido (новак) |
Публикувано | 18.01.07 22:08 |
|
Най- вероятно, във файла, след ред 58, няма #13#10 (край на ред). Някой програми, особено в линукс, слагат само #10. Посто потърси с Pos дали има #13#10 в дългия стринг.
| |
Тема
|
Re: Четене на голям текстов файл
[re: vido]
|
|
Автор | Desso (Нерегистриран) |
Публикувано | 19.01.07 23:56 |
|
Извинявам се за закъснелия отговор но досега имах и други задачи.
Видо се оказа напълно прав за липсата на #13. Да ама сега какво да предприема? Няма ли настройка за четене на такива текстови файлове?
| |
Тема
|
Re: Четене на голям текстов файл
[re: Desso]
|
|
Автор |
SAGE_BS (познавам го) |
Публикувано | 20.01.07 19:10 |
|
Може да използваш "BlockRead()" и слд това да обработиш прочетеното.
| |
Тема
|
Re: Четене на голям текстов файл
[re: SAGE_BS]
|
|
Автор |
Mixy (@#$%^) |
Публикувано | 21.01.07 13:40 |
|
Виж също и функцията AdjustLineBreaks в хелпа - тя ще ти помогне.
Mixy
| |
Тема
|
Re: Четене на голям текстов файл
[re: Mixy]
|
|
Автор | Desso (Нерегистриран) |
Публикувано | 21.01.07 21:03 |
|
Реших да опитам с TFileStream. Забелязах обаче че четенето става доста бавно, тъй като чета символ по символ:
procedure TForm1.Button2Click(Sender: TObject);
var
s:Char;
ii:integer;
begin
Stream:=TFileStream.Create(FileName.Text,fmOpenRead);
for ii:=1 to Round(Stream.Size) do
begin
Stream.Read(s,SizeOf(s));
showmessage(s);
end;
end;
Така лесно се намира CR/LF, но ...
Приемам още идеи, на Mixy благодаря ама не знам как точно ще стане...
| |
Тема
|
Re: Четене на голям текстов файл
[re: Desso]
|
|
Автор |
vido (новак) |
Публикувано | 21.01.07 21:47 |
|
Другият вариант е нещо от рода:
procedure TForm1.Button2Click(Sender: TObject);
var
s, L:String;
ii:integer;
begin
Stream:=TFileStream.Create(FileName.Text,fmOpenRead);
SetLength(s, 65536);
for ii:=1 to (Stream.Size div 65536) + 1 do
begin
Stream.Read(s[1], 65536);
p := Pos(#10, s);
while p > 0 do
begin
L := Copy(s, 1, p - 1);
......
......
Delete(s, 1, p);
p := Pos(#10, s);
end
end;
end;
трябва да се добави пресмятане на дължината на последния прочетен стринг (mod 65536) или да се ползва стойността от Stream.Read. Писано е на бързо. Трябва да се дооправи :)
Редактирано от vido на 21.01.07 21:49.
| |
Тема
|
Re: Четене на голям текстов файл
[re: vido]
|
|
Автор | Desso (Нерегистриран) |
Публикувано | 25.01.07 22:12 |
|
Благодаря vido, малко пипнах твоя код и сега работи чудесно.
| |
|
|
|
|