Optymalizacja, sortowanie wpisów w INI

0

Chciałbym zoptymalizować ładowanie wpisów z pliku INI.
Myślę że pomogło by najzwyklejsze posortowanie alfabetyczne wpisów.

W pliku INI mam tak:
[F_Wpis_Na_literę_F]
1=cos
2=cos2
3=cos3

[C_Wpis_Na_literę_C]
1=cos
2=cos2
3=cos3

[A_Wpis_Na_literę_A]
1=cos
2=cos2
3=cos3

i chciałbym to posortować alfabetycznie, ale według głównych pozycji w nawiasach kwadratowych []. Jak to posortować ?
Z założenia dłużej jest wyszukiwana pozycja w pliku NIE posortowanym - stąd problem.

0

odczytujesz sekcje (readSections), sortujesz (quicksort), zapisujesz... innego wyjścia nie widze ;)

0

Mile widziany przykład ;)

Albo inny sposób (chodzi o to aby całe bloki były przesuwane w kolejność alfabetyczną, a nie tylko te w nawiasach [])

0

Opi.

Początkowo też robiłem listę w pliku ini, jednakże odczytanie jej gdy wpisów jest ponad 1000 to około 2 minuty - makabra.

O wiele łatwiej jest zdefiniować jakiś rekord i zapisywać-odczytywać rekordy.

type 
      gracz_rekord = record	// inicjacja typu rekordu //
      login: integer;
      pass: integer;
      punkty: integer
    end;
var
  MainForm1: TMainForm1;
  gracz: array[1..10000] of gracz_rekord;
  gracz_plik: file of gracz_rekord;
  i: integer;

------------------------A tu procedurki odczyt-zapis----------

procedure TMainForm1.ButtonZapiszPlikClick(Sender: TObject);
begin
 AssignFile(gracz_plik,'gracze.bzd');
 Rewrite(gracz_plik);
 for i:=1 to 10000 do
 begin
  write(gracz_plik,gracz[i]);
 end;
 CloseFile(gracz_plik);
 LabelStatus.Caption:='Zapisano dane do pliku.';
end;


procedure TMainForm1.ButtonLoadClick(Sender: TObject);
begin
 AssignFile(gracz_plik,'gracze.bzd');
 Reset(gracz_plik);
 for i:=1 to 10000 do
 begin
  read(gracz_plik,gracz[i]);
 end;
 CloseFile(gracz_plik);
 LabelStatus.Caption:='Odczytano dane z pliku.';
end; 

Po wczytaniu rekordów, sortujesz je i wszystko gra.

---------------------U Ciebie może to być przykładowo:----------------------

Type
Moj_rekord = Record
Header_A_Z : string;
cos :string;
cos2 :string;
cos3 :string;
end;

 var
MaxWpisow : Cardinal;
Lista :array [1..MaxWpisow] of  Moj_rekord;
TMP : Moj_rekord;
//itd...

Potem możesz to sortować, używając zmienną Header_A_Z

for I:=MaxWpisow-2 downto 0 do begin
  for J:=1 to I+1 do begin
if comparetext(Lista [j+1].Header_A_Z,Lista [j].Header_A_Z)<0 then
      begin
      TMP:=Lista [J];
      Lista [J]:=Lista [J+1];
      Lista [J+1]:=TMP;
      end;
    end;

end;

Pozdrawiam.

0

0czywiscie na szybko pisąłem, miało być:

type
Moj_rekord = record
Header_A_Z : string[1];
cos :string[255];
cos2 :string[255];
cos3 :string[255];
end;
0

Wielkie dzięki Entek za przykładzik.
Muszę się przyznać że na rekordach prawie nic nie umiem :-| więc mało skorzystam.

Poza tym nie wiem jak zapisywać do takiej bazy nowe wpisy tak jak to ma miejsce w plikach INI.

Entek napisał(a)

Opi.

Początkowo też robiłem listę w pliku ini, jednakże odczytanie jej gdy wpisów jest ponad 1000 to około 2 minuty - makabra.

U mnie wpisów jest ponad 3000 wpisów i wyszukuje w ciągu 1 sekundy, więc nie wiem dlaczego u Ciebie tak długo to trwa ???

Myślałem sobie tez nad tym, aby ta baza nie była widoczna, ale czy jest sens ją szyfrować, i ile by trwało odszyfrowanie pliku mającego 3000 wpisów ~150kB ?

0

U mnie wpisów jest ponad 3000 wpisów i wyszukuje w ciągu 1 sekundy, więc nie wiem dlaczego u Ciebie tak długo to trwa ???

Ja muszę wczytywać całą listę do pamięci.
Co innego gdy wczytujesz jeden wpis.

Kodowanie na dzisiejszych komputerach jest bardzo szybkie, nawet RSA :)
Na sieci można znaleźć gotowe komponenty.

Na początek możesz użyć zwykłego Xor-owania
http://www.kryptografia.com/algorytmy/xor.html

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