AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

dateinamen "speziell" sortieren

Ein Thema von Aenogym · begonnen am 14. Feb 2006 · letzter Beitrag vom 15. Feb 2006
Antwort Antwort
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#1

dateinamen "speziell" sortieren

  Alt 14. Feb 2006, 17:09
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
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#2

Re: dateinamen "speziell" sortieren

  Alt 14. Feb 2006, 17:24
Wenn es eine StringList ist:

SL.Sort; soll aber zb. AB9 vor AB10 sein, dann musst du mal in der CodeLib nach Natürliche SortierungNatürliche Sortierung 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;
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: dateinamen "speziell" sortieren

  Alt 14. Feb 2006, 17:28
Zitat von glkgereon:
Wenn es eine StringList ist:

SL.Sort; soll aber zb. AB9 vor AB10 sein, dann musst du mal in der CodeLib nach Natürliche SortierungNatürliche Sortierung 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
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#4

Re: dateinamen "speziell" sortieren

  Alt 14. Feb 2006, 17:34
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...
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: dateinamen "speziell" sortieren

  Alt 14. Feb 2006, 17:38
Zitat von glkgereon:
Du siehst alles als Hex an

Zahlen um 6 erhöhen
Buchstaben um 10 erniedrigen...
den part verstehe ich jetzt nicht
wie meinst du das?
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.664 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: dateinamen "speziell" sortieren

  Alt 14. Feb 2006, 17:43
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;
Sven Harazim
--
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#7

Re: dateinamen "speziell" sortieren

  Alt 14. Feb 2006, 17:50
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
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#8

Re: dateinamen "speziell" sortieren

  Alt 14. Feb 2006, 17:53
Zitat von Aenogym:
Zitat von glkgereon:
Du siehst alles als Hex an

Zahlen um 6 erhöhen
Buchstaben um 10 erniedrigen...
den part verstehe ich jetzt nicht
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
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: dateinamen "speziell" sortieren

  Alt 14. Feb 2006, 19:54
ich habe jetzt die funktion von sh17 genommen, weils einfach funktioniert und es eben schnell gehen musste.
vielen dank euch beiden!!!

aeno
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.664 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: dateinamen "speziell" sortieren

  Alt 15. Feb 2006, 06:35
Die Funktion von glkgereon ist natürlich eleganter.
Sven Harazim
--
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 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