Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Wert mit Hilfe einer Formatierungsmaske aus String auslesen (https://www.delphipraxis.net/152353-wert-mit-hilfe-einer-formatierungsmaske-aus-string-auslesen.html)

Hutzel 19. Jun 2010 21:41

Wert mit Hilfe einer Formatierungsmaske aus String auslesen
 
Hallo zusammen!

Ich möchte aus einem String mit Hilfe einer Maske einen Substring ermitteln - Ungefähr so:
  • SourceString z.B. : 'Die Simpsons Folge 114.avi'
  • Format: 'Die Simpsons Folge %s.avi'
  • Platzhalter: '%s'
  • --> Als Ergebnis sollte der Algorithmus hier die Nummer der Folge, also '114' zurückliefern

Jetzt durchwühle schon seit ner geschlagenen Stunde vergeblich die Delphi-Hilfe und das Forum. :(
Hatte eigentlich vermutet, dass Delphi irgendwo eine entsprechende Funktion mitliefert. Vielleicht bin ich aber auch einfach zu blöd, sie zu finden...:wink:

Erwarte nicht, dass das jemand für mich schreibt, aber wollte nur nochmal nachgefragt haben ob's schon was gibt, bevor ich die Funktion selber schreibe.

Danke im Voraus für Eure Hilfe.

Jens Hartmann 19. Jun 2010 21:48

AW: Wert mit Hilfe einer Formatierungsmaske aus String auslesen
 
Hallo,

also zum durchsuchen von Strings, wird dir POS weiterhelfen. Darüber gibt es hier auch einige Beiträge. Allerdings musst Du Dir die Maske selberschreiben. Die sollte ja nach deinen Vorstellungen sein. Schreib Dir einen Parser, der die Daten wie Du Sie haben willst zurück gibt.

Am besten das ganze in eine Klasse packen, dann kannst Du verschieden Sachen später davon ableiten.

Gruß Jens

haentschman 19. Jun 2010 21:50

AW: Wert mit Hilfe einer Formatierungsmaske aus String auslesen
 
Das Problem an der Geschichte ist, daß die "Zahl" nicht immer aus der gleichen Anzahl Zeichen besteht. Sonst wäre das mit Copy schnell erledigt.

Da würde mir folgendes einfallen:
Zitat:

Format: 'Die Simpsons Folge %s.avi'
- als "Platzhalter" ein Zeichen was eher unwahrscheinlich ist.
Beispiel: Format: 'Die Simpsons Folge #.avi'
- die Position des # und das Zeichen danach (.) bestimmen
- ab der Position jedes Zeichen einem String hinzufügen bis . erreicht
- dann sollte im String z.B. "114" stehen.
- ggf. bei Bedarf in z.B. Integer wandeln.

...so als Idee.

Hutzel 19. Jun 2010 22:16

AW: Wert mit Hilfe einer Formatierungsmaske aus String auslesen
 
Danke für die Antworten.

Schade, also keine Delphi-Interne Function... :cry:

Zitat:

als "Platzhalter" ein Zeichen was eher unwahrscheinlich ist.
Werde als Platzhalter ein '?' nehmen, das ist in Dateinamen ja nicht erlaubt, kommt also garantiert nicht vor.
Damit wäre die Position ja schon mal bestimmt, ab der ich den Substring kopieren muss.

Jetzt gehts an die Länge des Substrings:
Zitat:

die Position des # und das Zeichen danach (.) bestimmen
Wenn ich das Zeichen danach alleine nehme könnte das vllt. zu Fehlern führen
(z.B. bei 'Die Simpsons Folge 19.06.avi'), aber wenn ich den Rest der Maske nehme ('.avi') und mit PosEx dessen Position bestimme, müsste es doch gehen.

haentschman 19. Jun 2010 22:20

AW: Wert mit Hilfe einer Formatierungsmaske aus String auslesen
 
na gut, ich wußte nicht, daß auch 19.06.avi dabei sein kann. :zwinker:

wie du schon sagtest, mit PosEx die Position von .avi bestimmen und dann mit copy zwischen "Beginn" und "Ende" rauskopieren.

Hutzel 19. Jun 2010 22:37

AW: Wert mit Hilfe einer Formatierungsmaske aus String auslesen
 
Ja, hätte ich etwas konkretisieren können. Die Funktion sollte möglichst universell sein.
Lass dann gleich mal was von mir Hören, wenn ich fertig bin...

Hutzel 19. Jun 2010 23:05

AW: Wert mit Hilfe einer Formatierungsmaske aus String auslesen
 
Da isses :) Danke für die Mithilfe.
Entschuldigt mein "Denglisch" :-D

Code:
function GetFormatValue(SourceString, Formatierung, Platzhalter: string): string;
  //Wert mit Maske aus String auslesen
  //z.B. ermitteln der Simpsons-Folge:
  //Eingabe:
  //  SourceString:   'Simpsons Folge 114.avi'
  //  Formatierung:   'Simpsons Folge ?.avi'
  //  Platzhalter:    '?'
  //  --> Ergebnis:   '114'
var
  CutStart, CutEnd: integer;
  Endung, Teilstring: string;
begin
  //vordere Schneideposition bestimmen
    CutStart:= Pos(Platzhalter,Formatierung);

  //Endung (= alle Zeichen hinter dem Platzhalter) bestimmen
    Endung:= RightStr(Formatierung,length(Formatierung)-CutStart-length(Platzhalter)+1);

  //hintere Schneideposition bestimmen
    CutEnd:= posEx(Endung,SourceString,CutStart);

  //Teilstring kopieren und zurückgeben
    TeilString:= copy(SourceString,CutStart,CutEnd-CutStart);
    Result:= Teilstring;
end;

haentschman 19. Jun 2010 23:07

AW: Wert mit Hilfe einer Formatierungsmaske aus String auslesen
 
na siehste, geht doch. :thumb:

PS: manchmal ist Denglisch nicht verkehrt. Da kommt man nicht mit reservierten Wörtern in Konflikt. Nur wenn mehrere Personen den Quelltext pflegen ist es nicht angebracht :zwinker:

Namenloser 19. Jun 2010 23:24

AW: Wert mit Hilfe einer Formatierungsmaske aus String auslesen
 
Du hast das Problem jetzt zwar schon selbst gelöst, aber dennoch ein guter Tipp für die Zukunft, gerade, wenn's mal komplizierter wird, sind [dp]Reguläre Ausdrücke[/dp] (auch bekannt als RegEx(p)).


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:08 Uhr.

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