Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Punkte in Dateinamen ersetzen. (https://www.delphipraxis.net/155433-punkte-dateinamen-ersetzen.html)

Sanguis 22. Okt 2010 23:32

Delphi-Version: 2007

Punkte in Dateinamen ersetzen.
 
Guten Abend,

ich steh mal wieder auf dem Schlauch. Es hört sich einfach an, was ich vorhabe. Ich möchte alle Dateien in einem Ordner auslesen und nei jeder Datei im Dateinamen '.' durch ' ' ersetzen. Das Auslesen war auch kein Problem, das umbenennen auch nicht. Aber es wird auch der letzte '.' im Dateinamen ungewandelt. Das heisst, aus "Dies.ist.ein.Test.txt" wird dann "Dies ist ein Test txt".... der letzte Punkt müsste aber bleiben.
Ich hab überlegt, den Punkt hinterher wieder hinzuzufügen. Aber das geht schlecht, wenn ich die Dateiendung und deren Länge nicht kenne.

Weiß jemand Rat?

Gruss,
Andreas

Namenloser 22. Okt 2010 23:39

AW: Punkte in Dateinamen ersetzen.
 
Schnell und einfach:
Delphi-Quellcode:
FileNameNew := StringReplace(ChangeFileExt(FileNameOld,''), '.', ' ', [rfReplaceAll])+ExtractFileExt(FileNameOld);

Bummi 22. Okt 2010 23:46

AW: Punkte in Dateinamen ersetzen.
 
Delphi-Quellcode:
Function GetCleanFilename(const s:String):String;
begin
  Result := StringReplace(ChangeFileExt(s,''),'.',' ',[rfReplaceAll]) + ExtractFileExt(s);
end;

Luckie 22. Okt 2010 23:58

AW: Punkte in Dateinamen ersetzen.
 
Get ist ein schlechtes Verb für die Funktion. Mit Get verbindet man in der Regel einer Getter-Methode einer Klasse, die den Wert eines Attributs zurückliefert. Make, Do oder gar nichts wäre besser. Oder noch besser ReplaceDotsWithSpaceInFilename(Filename: string): string; Man könnte es noch verallgemeinern: ReplaceDotsInFilename(Filename: string, ReplaceWith: string = ' ');

Christian Seehase 23. Okt 2010 01:13

AW: Punkte in Dateinamen ersetzen.
 
Moin Zusammen,

statt sich mit solchen Funktionen wie StringReplace zu belasten (bezüglich der Performance) schlage ich folgenden Weg vor:

Delphi-Quellcode:
function ReplaceDotsInFilename(const AsFilename : string;const AReplaceChar : Char = ' ') : string;

var
  i : Integer;

begin
  SetLength(Result,Length(AsFilename));
  for i := 1 to LastDelimiter('.',AsFilename)-1 do begin
    if AsFilename[i] <> '.' then begin
      Result[i] := AsFilename[i];
    end else begin
      Result[i] := AReplaceChar;
    end;
  end;
  for i := LastDelimiter('.',AsFilename) to Length(AsFilename) do begin
    Result[i] := AsFilename[i];
  end;
end;

Sanguis 23. Okt 2010 12:46

AW: Punkte in Dateinamen ersetzen.
 
Ich danke Euch vielmals! Manchmal sieht man den Wald vor lauter Bäumen nicht und denkt viel zu kompliziert. Also, danke :).

Sanguis 23. Okt 2010 16:34

AW: Punkte in Dateinamen ersetzen.
 
Au man, meine Zerstreutheit nimmt kein Ende.
Ich möchte noch alles was in Klammern steht, inkl. der Klammern, aus dem String entfernen. Ich denke dazu muss ich mit pos() die Klammern finden und dann einen Substring erstellen. Mein Problem ist, das die Klammern mehrfach vorkommen können und nicht immer an der selben Stelle. Also mal am Anfang, mal in der Mitte, mal am Ende. Mit immer unterschiedlichem Inhalt. Wonach soll ich also suchen und wie entferne ich nur den Teil?
Au mann... ich bekomm Kopfschmerzen...

Gruss,
Andreas

Bummi 23. Okt 2010 16:42

AW: Punkte in Dateinamen ersetzen.
 
Wenn Du den Code von Christian Seehase dahingehend modifizierst daß Du nur gültige oder ersetzte Zeichen an ein inital leeres Result anhängst kannst Du sobald Du ( findest z.B. eine Flag IsInBreak setzen welches beim Erreichen von ) zurückgesetzt wird. Solange IsInBreak gesetzt ist wird nichts an Result angehängt.

himitsu 23. Okt 2010 16:42

AW: Punkte in Dateinamen ersetzen.
 
Man könnte das ganze Problem bestimmt auch via RegEx lösen.


Aber zu den [...]:
via Delphi-Referenz durchsuchenPos nach dem '[' suchen,
dann über Delphi-Referenz durchsuchenPos/Delphi-Referenz durchsuchenPosEx das nachfolgende ']' finden
und nun via Delphi-Referenz durchsuchenDelete diesen Bereich löschen.

Hansa 23. Okt 2010 16:52

AW: Punkte in Dateinamen ersetzen.
 
Du brauchst dazu
Delphi-Quellcode:
pos
und
Delphi-Quellcode:
delete
Pos wird dabei zweimal gebraucht. Zuerst mal die Position der öffenden Klammer festhalten und dann die Position der schliessenden. Alles dazwischen wird mit delete gelöscht. Notfalls wird das eben mehrfach gemacht, zumindest bis dann endlich pos ('(',st) = 0 ist. Das sind aber alles elementare Grundlagen. Deshalb der obligatorische Hinweis : Handbuch lesen. Diese Aufforderung käme mit 100% Sicherheit sowieso in nächster Zeit. :mrgreen:

Bummi 23. Okt 2010 16:53

AW: Punkte in Dateinamen ersetzen.
 
bitte gegf. anpassen
Delphi-Quellcode:

Function ReplaceAllWHatIDontWannaHave(const s:String):String;
var
  i:Integer;
  IsInBreak:Boolean;
  Procedure Resultadd(c:Char);
    begin
      if not IsInBreak then Result := Result + c;
    end;
begin
  IsInBreak := false;
  for I := 1 to LastDelimiter('.',s)-1 do
    begin
      if s[i] ='.' then ResultAdd(' ')
      else if s[i] ='(' then IsInBreak := true
      else if s[i] =')' then IsInBreak := False
      else ResultAdd(s[i]);
    end;
  Result := Result + ExtractFileExt(s);
end;

Sanguis 23. Okt 2010 16:57

AW: Punkte in Dateinamen ersetzen.
 
Ok, PosEx war mir neu (ratet mal was ich fand, als ich grad bei Google danach suchte :shock:).

Also ermittel ich mit Pos erst ab wann das erste Mal '(' auftaucht. Mit PosEx dann das erste Auftauchen von ')' und für delete brauch ich dann noch den Pos Wert - den PosEx Wert, weil delete (laut google) nur Zeichenlängen übernimmt, keine Delemiter. Hab ich so richtig gedacht?

Gruss,
Andreas

Hansa 23. Okt 2010 17:05

AW: Punkte in Dateinamen ersetzen.
 
Ne, nicht ganz richtig verstanden. Das erste Pos ermittelt eben die Position des ersten Zeichens. Das wäre dann in der Richtung :
Delphi-Quellcode:
Anfang := Pos (st,'(');
Ende der Klammer :
Delphi-Quellcode:
Ende := Pos (st,')');
Alles zwischen den Klammern löschen :
Delphi-Quellcode:
delete (st,Anfang, Ende);
Wie gesagt : Besser F1 drücken, da steht sowieso alles ausführlich drin.

Christian Seehase 23. Okt 2010 17:09

AW: Punkte in Dateinamen ersetzen.
 
Moin Zusammen,

man kann das natürlich auch alles mit Pos, PosEx und Copy machen, läuft dann aber Gefahr strings oft in der Länge zu ändern, was, je nach Anzahl, auch auf die Performace drücken kann.
Ich würd's so lösen:


Delphi-Quellcode:
function RemoveBetween(const AsValue : string;const AOpenChar : char = '(';const ACloseChar : Char = ')') : string;

var
  iIndexIn : Integer;
  iIndexOut : Integer;
  iState   : Integer;

begin
  SetLength(Result,Length(AsValue));
  iIndexIn := 1;
  iIndexOut := 0;
  iState   := 1;
  while iIndexIn <= Length(AsValue) do begin
    case iState of
      1 : begin // Alles bis zum AOpenChar übernehmen
        if AsValue[iIndexIn] <> AOpenChar then begin
          Inc(iIndexOut);
          Result[iIndexOut] := AsValue[iIndexIn];
        end else begin
          iState := 2;
        end;
      end;
      2 : begin // Alles bis zum ACloseChar ignorieren
        if AsValue[iIndexIn] = ACloseChar then begin
          iState := 1;
        end;
      end;
    end;
    Inc(iIndexIn);
  end;
  SetLength(Result,iIndexOut);
end;

Sanguis 23. Okt 2010 17:10

AW: Punkte in Dateinamen ersetzen.
 
Zitat:

Zitat von Bummi (Beitrag 1057358)
bitte gegf. anpassen
Delphi-Quellcode:

Function ReplaceAllWHatIDontWannaHave(const s:String):String;
var
  i:Integer;
  IsInBreak:Boolean;
  Procedure Resultadd(c:Char);
    begin
      if not IsInBreak then Result := Result + c;
    end;
begin
  IsInBreak := false;
  for I := 1 to LastDelimiter('.',s)-1 do
    begin
      if s[i] ='.' then ResultAdd(' ')
      else if s[i] ='(' then IsInBreak := true
      else if s[i] =')' then IsInBreak := False
      else ResultAdd(s[i]);
    end;
  Result := Result + ExtractFileExt(s);
end;

Danke, das hilft mir sehr. Funktioniert prima! Danke :).

Zitat:

Zitat von Hansa (Beitrag 1057357)
Diese Aufforderung käme mit 100% Sicherheit sowieso in nächster Zeit. :mrgreen:

Ich weiss... aber bei Delphi 3 hab ich mich mit Stringoperationen zum letzten Mal intensiv beschäftigt. Danach war ich größtenteils durch DB Programmierung ausgelastet. Da wurschtelt man zwar auch mit Strings rum, aber eher in der DB Syntax. Und seit Delphi3 hat sich einiges verändert. Sorry für die vermeintlich einfachen Fragen. Aber wenn man so davor sitzt, kommt auf naheliegendes manchmal nicht.
Danke für die Hilfe jedenfalls :).

Gruss,
Andreas

Hansa 23. Okt 2010 17:23

AW: Punkte in Dateinamen ersetzen.
 
Ja ja, ist schon klar. Man fragt einfach mal, bevor man selber mal guckt. :mrgreen:

Bei dem bisher angesprochenen gilt das hier aber nicht :

Zitat:

Zitat von Sanguis (Beitrag 1057364)
Und seit Delphi3 hat sich einiges verändert.

pos und delete gibts schon ewig. Zumindest sehr lange vor D3.

Sanguis 23. Okt 2010 17:32

AW: Punkte in Dateinamen ersetzen.
 
Zitat:

Zitat von Hansa (Beitrag 1057369)
Ja ja, ist schon klar. Man fragt einfach mal, bevor man selber mal guckt. :mrgreen:

Nicht mein Stil. Ich hab Stundenlang gesucht, aber nur was gefunden, um eine vorgegebene Zeichenkette zu löschen. Aber nicht als von-bis.

Zitat:

pos und delete gibts schon ewig. Zumindest sehr lange vor D3.
Japp, deshalb wusste ich ja auch das es in der Richtung sein muss. Nur die Logik dafür, wie es in meinem Fall genau geht, war mir nicht klar.
Übrigens, PosEx gab es in Delphi3 definitiv noch nicht :).


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:16 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