![]() |
Re: INI-Datei sortieren
Zitat:
Delphi-Quellcode:
Grüße vom marabu
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; |
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 |
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 |
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. ![]() MfG |
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:
Heitere Grüße vom marabu
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; |
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 |
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:
marabu
...
ini.WriteString(IntToStr(Succ(i)), sKey, slSection.Values[sKey]); ... |
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. |
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