AGB  ·  Datenschutz  ·  Impressum  







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

Dateinamen auslesen und sortieren

Ein Thema von Nico B. · begonnen am 5. Apr 2023 · letzter Beitrag vom 11. Apr 2023
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Dateinamen auslesen und sortieren

  Alt 6. Apr 2023, 14:30
Habe es nur mal rasch mit FreePascal probiert und stelle nichts falsches fest wenn ich es so mache:

Macht Delphi da was anders?
Wenn ich das richtig verstanden habe, das ist genau das Problem. 2.12 steht bei Dir vor 2.3. Gewollt ist aber anders, weil 12 > 3 ist. Oder irre ich mich?
2.12 ist kleiner als 2.3 (ausgeschrieben 2.30, vielleicht ist es so besser verständlich), also ja, du irrst Dich oder die Benennung ist schlicht falsch.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#12

AW: Dateinamen auslesen und sortieren

  Alt 6. Apr 2023, 14:45
Es handelt sich aber nicht um Dezimalzahlen mit Nachkommastellen, sondern um Nummerierungen, wie sie z. B. auch bei Word, OpenOffice ... üblich sind.

Kapitel 2.3 steht da auch vor Kapitel 2.12, allerdings steht Kapitel 2.30 hinter Kapitel 2.12, ist aber nicht identisch mit Kapitel 2.3.

Im vorliegenden Fall fehlt bei den Zahlen nach dem Punkt genaugenommen die führende 0 und die Sortierung soll die fehlende 0 mit berücksichtigen.

Die Punkte sind letztlich nur optische Trenner zwischen unterschiedlichen Zahlengruppen. Jede Zahlengruppe soll für sich aufsteigend sortiert werden. Und damit ist 3 < 12 und von daher 2.3 vor 2.12 einzusortieren.

Geändert von Delphi.Narium ( 6. Apr 2023 um 16:10 Uhr) Grund: Schreibfehler
  Mit Zitat antworten Zitat
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#13

AW: Dateinamen auslesen und sortieren

  Alt 6. Apr 2023, 15:15
Hallo zusammen,

ja, also Delphi.Narium hat es richtig erfasst und zusammengefasst.
Es handelt sich tatsächlich um eine Struktur wie bei einer Kapitelnummerierung.
Und dort ist die 2.3 vor der 2.12 zu finden.

Anfangs habe ich überhaupt nicht daran gedacht, dass es hier ein Problem geben könnte, da die Dateien im Explorer in der korrekten Reihenfolge angezeigt werden.
Umso überraschter bin ich jetzt, dass es mir so schwer fällt dafür eine einfache Lösung zu finden.

Gibt es denn irgendwo eine Übersicht über die möglichen "Filter" von TCompareOptions?
Dann würde ich da gern weiterlesen um zu verstehen, wo es klemmt und wie es besser geht.
Nico Bäger
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#14

AW: Dateinamen auslesen und sortieren

  Alt 6. Apr 2023, 15:31
https://docwiki.embarcadero.com/Libr...CompareOptions

https://docwiki.embarcadero.com/Libr...TCompareOption
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#15

AW: Dateinamen auslesen und sortieren

  Alt 6. Apr 2023, 15:53
Gibt es denn irgendwo eine Übersicht über die möglichen "Filter" von TCompareOptions?
Dann würde ich da gern weiterlesen um zu verstehen, wo es klemmt und wie es besser geht.
Wie schon erwähnt ist die Compare-Funktion nicht das Problem - die funktioniert. Es liegt vielleicht daran, wie du sie verwendest. Erstell doch mal ein simples Beispielprojekt. Dann können wir dir vielleicht sagen, was da nicht passt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von PaPaNi
PaPaNi

Registriert seit: 31. Mär 2022
47 Beiträge
 
#16

AW: Dateinamen auslesen und sortieren

  Alt 6. Apr 2023, 18:50
Kannst du vielleicht damit anfangen? Hier habe ich kurz ein Beispiel ohne string.compare gebastelt. Das funktioniert bei mir im Delphi 2007.

Delphi-Quellcode:
function MySortCompare(List: TStringList; Index1, Index2: Integer): Integer;
var
  wStr1: WideString;
  wStr2: WideString;
  Flags: Dword;
begin
  wStr1 := List[Index1];
  wStr2 := List[Index2];
  Flags := 9; // coDigitAsNumbers + coIgnoreCase
  Result := CompareStringW(LOCALE_USER_DEFAULT, Flags, PWideChar(wStr1), Length(wStr1), PWideChar(wStr2), Length(wStr2)) - CSTR_EQUAL;
end;

procedure Tf_Tester.TestCustomSort;
var
  SL: TStringList;
  i: Integer;
begin
  m_test.Clear;
  SL := TStringList.Create;
  try
    SL.Add('2.6.1.csv');
    SL.Add('4.5.csv');
    SL.Add('4.9.1.csv');
    SL.Add('1.3.csv');
    SL.Add('2.3.csv');
    SL.Add('2.6.2.csv');
    SL.Add('1.7.csv');
    SL.Add('4.9.2.csv');
    SL.Add('1.6.csv');
    SL.Add('2.8.csv');
    SL.Add('2.6.3.csv');
    SL.Add('4.8.csv');
    SL.Add('2.12.csv');

    SL.CustomSort(@MySortCompare);
    for i := 0 to Pred(SL.Count) do begin
      m_test.Lines.Add(SL[i]);
    end;
  finally
    FreeAndNil(SL);
  end;
end;
Zitat:
Das Ergebnis:
1.3.csv
1.6.csv
1.7.csv
2.3.csv
2.6.1.csv
2.6.2.csv
2.6.3.csv
2.8.csv
2.12.csv
4.5.csv
4.8.csv
4.9.1.csv
4.9.2.csv
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#17

AW: Dateinamen auslesen und sortieren

  Alt 6. Apr 2023, 18:57
Delphi-Quellcode:
function MySortCompare(List: TStringList; Index1, Index2: Integer): Integer;
var
  Str1, Str2: string; // oder direkt List[...] benutzen
  Flags: Dword;
begin
  Str1 := List[Index1];
  Str2 := List[Index2];
  Flags := 9; // coDigitAsNumbers + coIgnoreCase
  Result := CompareString(LOCALE_USER_DEFAULT, Flags, PChar(Str1), Length(Str1), PChar(Str2), Length(Str2)) - CSTR_EQUAL;
end;
Warum sinnlos einen langsamen und vor allem unnötigen Speichermanager benutzen, inkl. einiger unnötig aufwändiger/langsamer String-Operationen? (Strings komplett umkopieren)

WideString = nutzt den Speichermanager, bzw. eine API des OLEAuth (OLE32)
UnicodeString = die Wide-Version des AnsiString

AnsiString/UnicodeString/UTF8String/usw. sind LongStrings und verwenden auch eine Referenzzählung, sowie den Delphi-Speichermanager (aktuell FastMM)
PS: Der Typ String[123] ist ein ShortString (nur der Vollständigkeit halber) ... sowie der Typ "String" im Delphi 1 und davor im Turbo Pascal.
$2B or not $2B

Geändert von himitsu ( 6. Apr 2023 um 19:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von PaPaNi
PaPaNi

Registriert seit: 31. Mär 2022
47 Beiträge
 
#18

AW: Dateinamen auslesen und sortieren

  Alt 6. Apr 2023, 20:38
Delphi-Quellcode:
function MySortCompare(List: TStringList; Index1, Index2: Integer): Integer;
var
  Str1, Str2: string; // oder direkt List[...] benutzen
  Flags: Dword;
begin
  Str1 := List[Index1];
  Str2 := List[Index2];
  Flags := 9; // coDigitAsNumbers + coIgnoreCase
  Result := CompareString(LOCALE_USER_DEFAULT, Flags, PChar(Str1), Length(Str1), PChar(Str2), Length(Str2)) - CSTR_EQUAL;
end;
Ich habe auch damit angefangen (mit CompareString und einfach string-Variablen), aber ich habe eine Fehlermeldung - Index out of range - bekommen. Warum weiß ich momentan nicht. Mit einem anderen Flag (weniger als 8) gab es keine Fehlermeldung, aber die Sortierung war nicht wie gewünscht (was logisch ist). Deshalb habe ich mit CompareStringW gemacht. Hast du selber mit deinem Code ausprobiert? funktioniert wie gewünscht? Welche Delphi-Version?
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Dateinamen auslesen und sortieren

  Alt 6. Apr 2023, 21:05
Wie wäre es hiermit? Getestet mit Delphi Alexandria um eine "logische" Sortierung zu implementieren, dabei ist dann das "Kapitel" da wo es sein sollte.
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.Classes;

function StrCmpLogicalW(P1, P2: PWideChar): Integer; stdcall; external 'Shlwapi.dllname 'StrCmpLogicalW';

function CompareProc(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := StrCmpLogicalW(PChar(List[Index1]), PChar(List[Index2]));
end;

var
  SL: TStringList;
  i: Integer;
begin
  try
    SL := TStringList.Create;
    try
      SL.Add('2.6.1.csv');
      SL.Add('4.5.csv');
      SL.Add('4.9.1.csv');
      SL.Add('1.3.csv');
      SL.Add('2.3.csv');
      SL.Add('2.6.2.csv');
      SL.Add('1.7.csv');
      SL.Add('4.9.2.csv');
      SL.Add('1.6.csv');
      SL.Add('2.8.csv');
      SL.Add('2.6.3.csv');
      SL.Add('4.8.csv');
      SL.Add('2.12.csv');
      SL.CustomSort(@CompareProc);
      for i := 0 to Pred(SL.Count) do
        WriteLn(SL[i]);
    finally
      SL.Free;
    end;
    ReadLn;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Zitat:
1.3.csv
1.6.csv
1.7.csv
2.3.csv
2.6.1.csv
2.6.2.csv
2.6.3.csv
2.8.csv
2.12.csv
4.5.csv
4.8.csv
4.9.1.csv
4.9.2.csv
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#20

AW: Dateinamen auslesen und sortieren

  Alt 6. Apr 2023, 22:45
Am Ende ist das doch alles das gleiche, oder was denkt ihr was die Delphi Methode intern macht?

Das Problem liegt offenbar woanders.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      

 

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 11:00 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