Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi INI-Datei sortieren (https://www.delphipraxis.net/51531-ini-datei-sortieren.html)

marabu 14. Aug 2005 21:52

Re: INI-Datei sortieren
 
Zitat:

Zitat von st18061974
Und ich würde ihm einfach ein Tool bauen wollen das diese INI sortiert. Ohne das man noch irgend etwas machen muß.

Wenn das so ist, dann probiere mal, ob du diesen Code (mit D5?) zum Laufen bringst:

Delphi-Quellcode:
uses
  Classes,
  IniFiles,
  SysUtils;

const
  tmj = 'dd.mm.yyyy';
  jmt = 'yyyy-mm-dd';

function ReformatStr(const s, sRule: string): string;
var
  i: integer;
begin
  Result := '';
  for i := 1 to Length(sRule) do
    Result := Result + s[Ord(sRule[i])];
end;

function ZeroPad(const i: cardinal; size: byte): string;
begin
  Result := IntToStr(i);
  if Length(Result) < size then
    Result := StringOfChar('0', size - Length(Result)) + Result;
end;

procedure IniSort;
var
  ini: TMemIniFile;
  s, sKey, sSection: string;
  slSort, slValues, slSection: TStringList;
  i, j, iAnzahl: integer;
begin
  slSort := TStringList.Create;
  slSection := TStringList.Create;

  ini := TMemIniFile.Create(ParamStr(1));
  iAnzahl := ini.ReadInteger('.', 'anzahl', 0);
  for i := 1 to iAnzahl do begin
    sSection := IntToStr(i);
    if ini.SectionExists(sSection) then begin
      s := ini.ReadString(sSection, 'Datum', '');
      s := ReformatStr(s, #7#8#9#10#4#5#1#2);
      ini.ReadSectionValues(sSection, slSection);
      s := s + ZeroPad(i, 4);
      slValues := TStringList.Create;
      slValues.Assign(slSection);
      slSort.AddObject(s, slValues);
    end;
  end;
  slSort.Sort;
  ini.Clear;
  ini.WriteString('.', 'Anzahl', IntToStr(iAnzahl));
  for i := 0 to slSort.Count - 1 do begin
    sSection := Copy(slSort[i], 9, 4);
    sSection := IntToStr(StrToInt(sSection));
    slSection := TStringList(slSort.Objects[i]);
    for j := 0 to slSection.Count - 1 do begin
      sKey := slSection.Names[j];
      ini.WriteString(sSection, sKey, slSection.Values[sKey]);
    end;
    slSection.Free;
  end;
  ini.UpdateFile;
  ini.Free;
  slSort.Free;
end;
Grüße vom marabu

st18061974 15. Aug 2005 18:59

Re: INI-Datei sortieren
 
@marabu:

Zunächst mal VIELEN, VIELEN, VIELEN Dank, das Du Dir die Mühe gemacht hast das zu Proggen. Es ist rasend schnell. Aber leider sortiert es nicht so wie ich es erhoffte.

Nach was da genau sortiert wird kann ich nocht nicht mal sagen, es ist irgendwie umsortiert, aber ich finde kein Schema. Und leider bleiben ja auch die Nummerierungen gleich. Doch genau diese sollen ja nach Datum sortiert sein.

@Jelly:

Muß für die Komponete nicht auf dem anderen Rechener auch die BDE installiert sein?

MfG

marabu 16. Aug 2005 07:03

Re: INI-Datei sortieren
 
Hi st18061974,

ich vermute mal, du musst noch das Literal 'Datum' in meinem Code nach 'date' abändern, damit deine Datei wirklich sortiert wird...

Grüße vom marabu

st18061974 17. Aug 2005 16:30

Re: INI-Datei sortieren
 
Hallo marabu

Nein, das habe ich natürlich gemacht. Und ich habe jetzt das "Sortiershema" erkannt.

Die in der INI gespeicherten Einträge werden nach der ersten Zahl sortiert. Also 1,2, ... 10,11 u.s.w. und zwar im Bezug auf Monat und Jahr. Allerdings von 2000 nach 2005 und dann von 1998 und 1999. Noch dazu ist mittedrin irgendwie ein Sprung an dem sie wieder bei 2000 anfängt. Ich vermute mal, da ich den Script nur bedingt kappiere, das es daran liegt das hier Strings sortiert werden und keine Daten.

Das ist aber auch alles nicht so Wild. Die INI wird nämlich nicht umsortiert sonder nur umstruckturiert. Tatsächlich bleiben alle Einträge bei Ihrem jeweiligen Zähler. Ich habe hier mal ein Vorher - Nachher - Bild. Bei diesem auslesen habe ich vor dem sortieren die letzte 100 ausgelesen und danach. Wie man sehen kann hat sich da nicht verändert.

http://home.arcor.de/st18061974/test/vornach.gif

MfG

marabu 17. Aug 2005 18:21

Re: INI-Datei sortieren
 
Du Schlingel,

in deinem ersten Posting hast du das Datum mit führenden Nullen bei Tag und Monat angegeben und darauf ist mein Code ausgerichtet. Wenn du ohne führende Nullen arbeiten willst, dann musst du die Funktion ReformatStr() durch die Funktion ReformatDate() ersetzen:

Delphi-Quellcode:
function ReformatDate(s: string): string;
var
  i, d,m,y: integer;
begin
  i := Pos('.', s);
  d := StrToInt(Copy(s, 1, Pred(i)));
  Delete(s, 1, i);
  i := Pos('.', s);
  m := StrToInt(Copy(s, 1, Pred(i)));
  Delete(s, 1, i);
  y := StrToInt(s);
  Result := ZeroPad(y, 4) + ZeroPad(m, 2) + ZeroPad(d, 2);
end;
Heitere Grüße vom marabu

st18061974 18. Aug 2005 16:47

Re: INI-Datei sortieren
 
Ja, Super, nochmals vielen,vielen Dank.

Doch weiterhin bleibt das Problem, das die INI in ihrer strucktur zwar umsortiert wird aber eben die Einträge ihre Zählöer behalten.

Soll heißen ...

[123]
date=1.1.2004

[456]
date=1.1.2003

wird sortiert nach

[456]
date=1.1.2003

[123]
date=1.1.2004

Bei auslesen allerdings ist das völlig egal. Und die Reihenfolge ist somit nicht geändert.

Ich habe natürlich bereits versuch da durchzusteigen ... leider ohne Erfolg. Ich krieg das nicht hin.

MfG

marabu 18. Aug 2005 16:55

Re: INI-Datei sortieren
 
Du verwirrst mich. Hat die Zahl, die den Abschnitt kennzeichnet, keine Bedeutung? Du willst die einfach neu durchnummerieren? Wenn dabei eventuelle Lücken verschwinden dürfen - nichts leichter als das. Ändere einfach die Zeile mit dem WriteString() aus:

Delphi-Quellcode:
...
ini.WriteString(IntToStr(Succ(i)), sKey, slSection.Values[sKey]);
...
marabu

st18061974 18. Aug 2005 18:33

Re: INI-Datei sortieren
 
VIELEN, VIELEN, VIELEN, VIELEN, VIELEN, VIELEN, VIELEN DANK.

So klappts. Das ganze Tool (incl. einer "Gauge" also dieser Fortschrittanzeige) hat jetzt gerade mal 382kb. Und es braucht für mein 2500 Einträge-Test-INI ca 3-4 Sekunden.

Nochmals, VIELEN Dank, MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz