Bardzo du?że pliki tekstowe

0

Czy zna ktoś jakąś szybszą metode na obróbkę pliku tekstowego.
Wczytuję plik tekstowy który ma rozmiar 40MB do zmiennej typu TStrings, następnie przy użyciu FindDialog filtruję tylko te wiersze które zawierająinteresujące mnie dane. Jest ich około 180000 i wpisuje je w memo. Następnie pobieram z tego memo i wyrzucam zbędne spacje, kropki. I trwa to bardzo bardzo długo. Wreszcie wpisuję znowu do memo i zapisuję do pliku. Jest jakaś szybsza metoda?

Piotr

0
  1. Sprawdz najpierw, ktore etapy trwaja najdluzej

  2. Dlaczego memo a nie drugi egzemplarz TStringList? Jak musi byc Memo, pamietaj o BeginUpdate i EndUpdate

0

Mam pytanie: czy musisz to wszystko widzieć? Skoro to automatycznie jest obrabiane to nie musisz wcale używać TStrings.
Załóżmy, że filtrujesz tekst i wczytujesz tylko te linie, które zawierają jakiś tekst (to co FindDialog by robiło).
Czyli wczytujesz np. linia po linii (ReadLn) do zmiennej typu string.
Potem wyszukujesz ciąg znaków (Pos).
Dalej usuwasz zbędne spacje czy co tam chcesz (też automatycznie...)
I zapisujesz linię (WriteLn) do jakiegoś pliku.
Działanie najszybsze ze wszystkich możliwych.

0

Możecie to bardziej sprecyzować? Nie do końca wiem jak to poukładać. Czy to jest coś w tym stylu?

procedure TForm1.Button2Click(Sender: TObject);
var
TextF:TextFile;
T:String;
I,Poz:Integer;
begin
AssignFile(TextF,'d:\Plik.txt');
Reset(TextF);
while not Eof(TextF) do
begin
Readln(TextF,T);
if Pos(' 0/',T)0 then
repeat
Poz:=Pos(' ',T);
if Poz>0 then
delete(T,Poz,1);
until Poz0 then
delete(T,Poz,1);
until Poz0 then
delete(T,Poz,1);
until Poz

0

To ja mam pytanie do Piotra : powiedz mi, jak Ci się udało wpakować do TStrings 180000 linii? Mi się udało tylko 32000, więcej nie wchodzi...

0

procedure TForm1.Button2Click(Sender: TObject);
var
TextF, TextDo:TextFile;
T:String;
I,Poz:Integer;
begin
AssignFile(TextF,'d:\Plik.txt');
Reset(TextF);
AssignFile(TextDo,'d:\Plik1.txt');
Rewrite(TextF);
while not Eof(TextF) do
begin
Readln(TextF,T);
T := StringReplace(T, ' ', ' ', [rfReplaceAll]); //Domyślam się, że 3 spacje na zamieniasz na jedną, ale to jakoś dziwnie robisz.
T := StringReplace(T, '.', '', [rfReplaceAll]); //Usuwanie wszystkich '.'
T := StringReplace(T, ';', '', [rfReplaceAll]); //Usuwanie wszystkich ';'
WriteLn(TextDo, T);
end;
CloseFile(TextF);
CloseFile(TextDo);
end;

A... Ja też wrzuciłem 180000 bez problemu :)

0

Duże dzięki !!!
Tak też działa

AssignFile(TextF,'PlikIn.txt');
Reset(TextF);
AssignFile(TextOut,'PlikOut.txt');
ReWrite(TextOut);
while not Eof(TextF) do
begin
Readln(TextF,T);
if Pos('/ ',T)0 then // ????
begin
repeat
Poz:=Pos(' ',T);
if Poz>0 then
delete(T,Poz,1);
until Poz=0;
repeat
Poz1:=Pos('.',T);
if Poz1>0 then
delete(T,Poz1,1);
until Poz1

0

Z tymi TStringami ilosc mozliwych do wpisania lancuchow byla w D5 ograniczona do 32000 lini, ale to bylo oganiczenie na indeks bo tstings moze teoretycznie przechowac w sobie sumarycznie do 2Gb danych (wielkosc wasciwosci text). Oczywiscie tak wielki string musi byc przechowywany nie tylko w pamieci ale wykorzystuje systemowy swap file co wiadomo roznie dziala i zalezy od konfiguracji systemu

pozdro [cya]

1 użytkowników online, w tym zalogowanych: 0, gości: 1