Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 14:59 13.06.24 
Компютри и Интернет
   >> Delphi
Всички теми Следваща тема *Кратък преглед

Тема Четене на голям текстов файлнови  
Автор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, малко пипнах твоя код и сега работи чудесно.




Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.