Odczyt danych z TXT - optymalnie.

0

Witam.
Mam do Was prosbe, otoz ponizej przedstawilem fragment zawartosci pliku TXT oraz czesc mojego "sposobu" na odczyt. Problem jest taki ze przy duzej ilosci danych odczyt trwa dluuuugo, a to jest nie dopuszczalne (tablica 15 X 1000, co daje 15tys wartosci - wowczas pozostaje tylko Application.ProcessMessages i wskaznik postepu wsadzic..no ale bez jaj [krzyk] to "tylko" kilkanascie tys. wartosci). Sadze ze kopiowanie lancucha do zmiennej i "wycinanie kawalkow" od| do | nie jest najlepszym pomyslem.
Rzuccie okiem, moze jakies wskazowki co do kodu aby go lepiej zoptymalizowac?

.................

-------------------- PLAN --------------------
| |X1 |X2 |X3 |
|H. Smith |1,0 |2,0 |3,0 |
|B. Jones |5,0 |1,0 |16,0|
|W. Miller |8,0 |3,0 |10,0|
|B. Robertson |2,0 |1,0 |15,0|
|C. Hansson |16,0|17,0|5,0 |
|S. Mann |12,0|9,0 |14,0|

(EoF)

PT :TextFile;
i,j,k : Integer;
S,TempNazwa,TempZmienne: String;
TabNazwyPrzypadkow : array of String;
TabGlowna : array of array of String;

.
.
.
.

if AnsiCompareText(Trim(s),'--------------------  PLAN  --------------------')=0 then
                 begin

                   while not Eoln(PT) do
                     begin
                       j:=0;
                       Readln(PT,s);
                       Trim(s);
                       Delete(S,1,Pos('|',s));
                       TempNazwa:=S;
                       Delete(TempNazwa,Pos('|',s),length(S)-Pos('|',s));
                       SetLength(TabNazwyPrzypadkow,i+1);
                       TabNazwyPrzypadkow[i]:=TempNazwa;
                       Delete(S,1,Pos('|',s));
                     while Pos('|',s)>0 do
                           begin
                             SetLength(TabGlowna,i+1,k+1) ;
                             TempZmienne:=S;
                             Delete(TempZmienne,Pos('|',s),length(S)-Pos('|',s)+1);
                             TabGlowna[i][j]:=TempZmienne;
                             Delete(s,1,Pos('|',s));
                             Inc(k);
                             Inc(j);
                           end;
                     IloscPrzypadkow:=i+1;
                     Inc(i);
                    end;
                end;

.
.
.....

Pozdrawiam

0

Ja bym to robił na rekordach.

0

Podstawowymi "opóźniaczami" są tablice dynamicznych stringów - za każdym razem kupa czasu sę marnuje na inicjację pamięci. W żadnym polu tekst nie powinien przekroczyć 255 znaków, więc używaj deklaracji array of string[255]. Albo nawet mniejszych wartości - dobierz je odpowiednio. A najlepiej połącz ograniczenie zmiennych tekstowych z rekordami - będzie jedna tablica zawierająca rekordy o stałej wielkości (tutaj jeszcze najlepiej ustaw tą wielkość na potęgę, albo chociaż wielokrotność dwójki - tylko pamiętaj, że SizeOf(string[10])=11 bajtów [do czepialskich - to jest pseudokod]).

0

Dzieki my_nick za uwagi. Masz racje, i wlasnie nawet zastanawialem sie nad ta nieszczesna tablica dynamiczna.
Problem rozwiazalem, nie korzystajac z tablicy dynamicznej "przetransportowalem" dane wprost do komponentu jakim jest StrinGrid. Zmodyfikowalem rozniez kod zupelnie inaczej (wywalajac 'Pos' calkowicie).Wlasnie najwiekszy "przestoj" wiazal sie z owa tablica, im wieksze wartosci zmiennych sterujacych tym przestoj byl proporcjonalnie wiekszy.
Co do rekordow, w sumie racja. Tylko te ograniczenia - trzeba je DOKLADNIE przewidziec.

[Do Szymka] - szkoda bitow, wiec w tym samym poscie napisalem do Was obojga :)
Tu masz racje zapis w postaci rekordow bylby najlepszy. Ale niestety, musze w ten sposob :(.

pozdrawiam [browar]

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