![]() |
dateinamen "speziell" sortieren
hi leute,
ich habe folgendes dringendes problem: ich habe einen ordner, in dem folgende dateien sind: fhbb-009.xml fhbb-009a.xml fhbb-009b.xml fhbb-0092.xml fhbb-0093.xml ich hole mir per FindFirst() und FindNext() diese dateinamen in eine stringlist um sie zu sortieren. denn find*() gibt die dateien ja nicht sortiert zurück. mein problem ist diese spezielle sortierungs-logik. ich habe ungefähr 5000 solcher dateien in dem ordner. die buchstabenfolge am anfang läuft von "a" bis "zz" und die zahlenfolge am ende läuft auch vom anfang bis ende durch, inklusive buchstaben als suffixe.... normalerweise für die fhbb-0092.xml direkt nach der fhbb-009.xml kommen. ich brauch aber unbedingt die reihenfolge wie oben gezeigt. könnt ihr mit helfen, wie ich meinestringlist eben so sortieren kann? ich verzweifle schon und es ist sehr dringen :( vielen dank schonmal an alle, aeno |
Re: dateinamen "speziell" sortieren
Wenn es eine StringList ist:
Delphi-Quellcode:
soll aber zb. AB9 vor AB10 sein, dann musst du mal in der CodeLib nach [cl]Natürliche Sortierung[/cl] suchen
SL.Sort;
OK, nachm 5ten Lesen hab ich jetzt hoffentlich genau verstanden was du meinst^^ du müsstest dir dann genau wie im Beispiel der Natürlichen Sortierung eine eigene Compare-Methode schreiben. In dieser müsstest du dann die Strings auseinandernehmen und vergleichen. In Etwa:
Delphi-Quellcode:
function OwnCompare(Vals: TStringList; I1, I2: Integer):Integer;
begin //Buchstaben rausholen if B1>B2 then I2_nach_vorne else if B1<B2 then I1_nach_vorne else begin //"Endung" rausholen if E1>E2 then I2_nach_vorne else if E1<E2 then I1_nach_vorne else bleibt_gleich; end; end; |
Re: dateinamen "speziell" sortieren
Zitat:
AB12A soll vor AB123 kommen :? beispiel für eine richtige sortierung, wie ich sie will: AB AB1 AB12 AB12A AB123 AB13 AC AC1 ... aeno |
Re: dateinamen "speziell" sortieren
je nachdem welche buchstaben vorkommen könntest du zb folgendes Machen:
Du siehst alles als Hex an Zahlen um 6 erhöhen Buchstaben um 10 erniedrigen dann als int umwandeln und vergleichen. damit hättest du dann die buchstaben vor die zahlen gebracht... |
Re: dateinamen "speziell" sortieren
Zitat:
wie meinst du das? |
Re: dateinamen "speziell" sortieren
Nicht ganz optimiert, aber geht
mal auf die schnelle, man kann sicher wieder vieles rausschmeißen
Delphi-Quellcode:
function StringListSortCompare2(List: TStringList; Index1, Index2: Integer): Integer;
var i : Integer; b1,b2 : Byte; begin Result := 1; if Length(List[Index1]) < Length(List[Index2]) then Result := -1 else if (Length(List[Index1]) = Length(List[Index2])) then begin Result := 0; for i := 1 to Length(List[Index1]) do if (List[Index1][i] <> List[Index2][i]) then begin b1 := Ord(List[Index1][i]); b2 := Ord(List[Index2][i]); if b1 < 58 then b1 := b1 + 75; if b2 < 58 then b2 := b2 + 75; if b1 < b2 then Result := -1 else Result := 1; break; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var hstrl : TStringList; begin hstrl := TStringList.Create; hstrl.Add('fhbb-009.xml'); hstrl.Add('fhbb-0092.xml'); hstrl.Add('fhbb-0093.xml'); hstrl.Add('fhbb-009a.xml'); hstrl.Add('fhbb-009b.xml'); hstrl.CustomSort(StringListSortCompare2); Memo1.Lines.Text := hstrl.Text; hstrl.Free; end; |
Re: dateinamen "speziell" sortieren
Noch eine Möglichkeit wäre, einfach die Priorität für alle Chars zu verändern.
Beispiel:
Delphi-Quellcode:
das solle ganz normal sortieren, du kann ja dann die entsprechenden Werte ändern ;)
function OwnSort(List: TStringList; Index1, Index2: Integer): Integer;
const LookUp: array [Char] of Byte = ( 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28, 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54, 55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80, 81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104, 105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123, 124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142, 143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161, 162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180, 181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199, 200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218, 219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237, 238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 ); var i, M: Integer; S1, S2: String; begin S1:=List[Index1]; S2:=List[Index2]; M:=Min(Length(S1),Length(S2)); Result:=0; for i:=1 to M do begin if LookUp[S1[i]]>LookUp[S2[i]] then Result:=1 else if LookUp[S1[i]]<LookUp[S2[i]] then Result:=2; if Result<>0 then Break; end; end; ![]() |
Re: dateinamen "speziell" sortieren
Zitat:
da du nun die zahlen vor die buchstaben setzen willst, könnte man in der hex-folge aus 0123456789ABCDEF einfach ABCDEF0123456789 machen....das ginge eben durch diese operationen ;) |
Re: dateinamen "speziell" sortieren
ich habe jetzt die funktion von sh17 genommen, weils einfach funktioniert und es eben schnell gehen musste.
vielen dank euch beiden!!! aeno |
Re: dateinamen "speziell" sortieren
Die Funktion von glkgereon ist natürlich eleganter. ;-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 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