Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi dateinamen "speziell" sortieren (https://www.delphipraxis.net/63150-dateinamen-speziell-sortieren.html)

Aenogym 14. Feb 2006 16:09


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

glkgereon 14. Feb 2006 16:24

Re: dateinamen "speziell" sortieren
 
Wenn es eine StringList ist:

Delphi-Quellcode:
SL.Sort;
soll aber zb. AB9 vor AB10 sein, dann musst du mal in der CodeLib nach [cl]Natürliche Sortierung[/cl] suchen


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;

Aenogym 14. Feb 2006 16:28

Re: dateinamen "speziell" sortieren
 
Zitat:

Zitat von glkgereon
Wenn es eine StringList ist:

Delphi-Quellcode:
SL.Sort;
soll aber zb. AB9 vor AB10 sein, dann musst du mal in der CodeLib nach [cl]Natürliche Sortierung[/cl] suchen

danke für die antwort, aber das ist nicht mein problem.

AB12A soll vor AB123 kommen :?

beispiel für eine richtige sortierung, wie ich sie will:

AB
AB1
AB12
AB12A
AB123
AB13
AC
AC1

...

aeno

glkgereon 14. Feb 2006 16:34

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...

Aenogym 14. Feb 2006 16:38

Re: dateinamen "speziell" sortieren
 
Zitat:

Zitat von glkgereon
Du siehst alles als Hex an

Zahlen um 6 erhöhen
Buchstaben um 10 erniedrigen...

den part verstehe ich jetzt nicht :oops:
wie meinst du das?

sh17 14. Feb 2006 16:43

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;

glkgereon 14. Feb 2006 16:50

Re: dateinamen "speziell" sortieren
 
Noch eine Möglichkeit wäre, einfach die Priorität für alle Chars zu verändern.

Beispiel:

Delphi-Quellcode:
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;
das solle ganz normal sortieren, du kann ja dann die entsprechenden Werte ändern ;) LookupTables

glkgereon 14. Feb 2006 16:53

Re: dateinamen "speziell" sortieren
 
Zitat:

Zitat von Aenogym
Zitat:

Zitat von glkgereon
Du siehst alles als Hex an

Zahlen um 6 erhöhen
Buchstaben um 10 erniedrigen...

den part verstehe ich jetzt nicht :oops:
wie meinst du das?

Das was du da als "endung" hast, könnte man als hex-wert auffassen.
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 ;)

Aenogym 14. Feb 2006 18:54

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

sh17 15. Feb 2006 05:35

Re: dateinamen "speziell" sortieren
 
Die Funktion von glkgereon ist natürlich eleganter. ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 Uhr.

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