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 3 von 3     123   
Nico B.

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

AW: Dateinamen auslesen und sortieren

  Alt 11. Apr 2023, 08:12
Hallo zusammen,

dann hier mal mein Code.
Ich muss dazu sagen, dass ich an einem Rechner programmiere, der nicht mit dem Internet verbunden ist.
Ich habe mir zwar beim Abschreiben Mühe gegeben, kann aber nicht ausschließen, dass sich ein Tipp-Fehler eingeschlichen hat.

Delphi-Quellcode:
function Sortierfunktion(Liste: TStringList; Index1: integer; Index2: integer): integer;
begin
  Result:=String.Compare(Liste[Index1],Liste[Index2],[coDigitAsNumbers,coIgnoreCase]);
end;

function AnlagenAuslesen: boolean;
var
  Anlage: TSearchRec;
  DateiListe: TStringList;
  i: integer;
begin
  Result:=true;
  DateiListe:=TStringList.Create;
  DateiListe.Sorted:=true;
  try
    if FindFirst(ExtractFilePath(ParamStr(0)),faAnyFile,Anlage)=0
      then
        try
          begin
            //alle Dateien auslesen
            repeat
              if Anlage.Attr AND faDirectory=faDirectory
                then
                  begin
                    //nichts tun
                  end
                else
                  begin
                    DateiListe.Add(Anlage.Name);
                  end;
            until FindNext(Anlage)<>0;
            //Dateien sortieren
            DateiListe.CustomSort(@Sortierfunktion);
            //Dateien in der richtigen Reihenfolge auslesen
            i:=0;
            while not (DateiListe.Count=i) do
              begin
                DateiAuslesen(ExtractFilePath(ParamStr(0))+DateiListe[i]); //weitere Funktion zum Auslesen der Dateien
                i:=i+1;
              end;
          end;
        finally
          DateiListe.Free;
          FindClose(Anlage);
        end;
  except
    Result:=false;
  end;
end;
Nico Bäger
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Dateinamen auslesen und sortieren

  Alt 11. Apr 2023, 09:42
DateiListe.Sorted:=true; <<--entfernen!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Nico B.

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

AW: Dateinamen auslesen und sortieren

  Alt 11. Apr 2023, 10:38
Vielen herzlichen Dank auch an Uwe (ohne sein Drängen hätte ich mir wahrscheinlich nicht gleich die Mühe gemacht das Programm abzutippen)!
Jetzt klappt es.

Diese Codezeile wurde in einem anderen Thread zu dem Thema als unbedingt notwendig betitelt.
Und in euren Beispielen habe ich einfach übersehen, dass ihr sie weggelassen habt.

VIELEN, VIELEN DANK noch einmal.
Und entschuldigt, dass ihr euch wegen meiner Dusseligkeit so lange Gedanken dazu machen musstet.
Nico Bäger
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Dateinamen auslesen und sortieren

  Alt 11. Apr 2023, 11:03
Kommt drauf an

soll automatisch sortiert werden, dann ja, das muß,
soll manuell sortiert werden, weil du hier selber CustomSort aufrufst, dann natürlich nicht.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Dateinamen auslesen und sortieren

  Alt 11. Apr 2023, 12:41
Hmmm die Embarcadoro Hilfe für TStringList.CustomSort ist aber auch etwas unglücklich beschrieben.
Zitat:
Note: You must explicitly call the CustomSort method. Setting the Sorted property only sorts strings using ANSI (Windows) or UTF-8 (Linux) order, as implemented in the Sort method.
Da sollte eigentlich stehen das beides sich gegenseitig bekämpft und CustomSort immer der Verlierer sein wird
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
560 Beiträge
 
Delphi 12 Athens
 
#26

AW: Dateinamen auslesen und sortieren

  Alt 11. Apr 2023, 13:16
Wäre if Anlage.Attr AND faDirectory <> faDirectory nicht einfacher?

Zudem gebe ich noch zu bedenken, dass du mit dem alleinigen Ausschluss von faDirectory sämtliche anderen Attribute ((faReadOnly, faHidden, faSystem, faArchive,faDevice, faNormal, faTemporary, faSparseFile, faReparsePoint, faCompressed,faOffline, faNotContentIndexed, faEncrypted, faSymLink) ) zulässt. Das mag in deinem Anwendungsfall keine Rolle spielen, sehr generisch ist es nicht.
  Mit Zitat antworten Zitat
Nico B.

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

AW: Dateinamen auslesen und sortieren

  Alt 11. Apr 2023, 13:33
Danke für den Hinweis.
Ich habe es jetzt mal beim FindFirst schon die Suche auf '*.csv' eingeschränkt.
Damit hat sich das doch schon erledigt, oder?
Sieht es jetzt besser aus?

Delphi-Quellcode:
    if FindFirst(ExtractFilePath(ParamStr(0))+'*.csv',faAnyFile,Anlage)=0
      then
        try
          begin
            //alle Dateien auslesen
            repeat
              if Anlage.Attr AND faDirectory<>faDirectory
                then
                  DateiListe.Add(Anlage.Name);
            until FindNext(Anlage)<>0;
          usw.usf.
Nico Bäger
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Dateinamen auslesen und sortieren

  Alt 11. Apr 2023, 13:42
Am einfachsten wäre es vermutlich GetFiles aufzurufen um das daraus entstandene Array zu sortieren und mit was auch immer fortzufahren.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: Dateinamen auslesen und sortieren

  Alt 11. Apr 2023, 13:56
So könnte es beispielsweise aussehen:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.Classes, System.IOUtils, System.Types;

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
  SA: TStringDynArray;
  SL: TStringList;
  i: Integer;
begin
  try
    SA := TDirectory.GetFiles(ExtractFilePath(ParamStr(0)));
    SL := TStringList.Create;
    try
      // mit oder ohne vollen Pfad?
      for i := Low(SA) to High(SA) do
        SL.Add(ExtractFileName(SA[i]));
      SL.CustomSort(@CompareProc);
      for i := 0 to Pred(SL.Count) do
        begin
          // mach was mit der Liste
          WriteLn(SL[i]);
        end;
    finally
      SL.Free;
    end;
    ReadLn;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
shebang
Online

Registriert seit: 7. Feb 2020
131 Beiträge
 
Delphi 11 Alexandria
 
#30

AW: Dateinamen auslesen und sortieren

  Alt 11. Apr 2023, 15:28
Dann würde ich mir aber die TStringList sparen und direkt auf dem Array arbeiten:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses System.SysUtils, System.IOUtils, Generics.Collections, Generics.Defaults;

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

var
  i: Integer;
  SA: TArray<string>;
begin
  try
    SA := TDirectory.GetFiles(ExtractFilePath(ParamStr(0)));

    TArray.Sort<string>(SA, TComparer<string>.Construct(
    function(const Left, Right : string) : Integer
    begin
      Result := StrCmpLogicalW(PWideChar(Left), PWideChar(Right));
    end));

    for i := 0 to High(SA) do
    begin
      // mach was mit der Liste
      WriteLn(SA[i]);
    end;
    ReadLn;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   

 

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 10:29 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