Seite 1 von 1

[UPDATE] ReplaceStrings() - Mehrere Strings auf einmal ers..

Verfasst: 12.07.2006 13:10
von AND51
Hallo!

Ich habe eine Prozedur geschrieben, die mehrere Strings auf einmal ersetzt. Es wird eine ausgewogene Kombination aus einer For-Schleife und dem PB-Befehl ReplaceString() verwendet. <)

Angenommen, ihr habt einen String, der sieht so aus:

Code: Alles auswählen

String$="%x von %y Dateien markiert, Größe: %size"
%x: wie viele Dateien markiert
%y: Anzahl Gesamtdateien
%size: Gesamtgröße

Dann musste man bisher immer schreiben:

Code: Alles auswählen

ReplaceString(ReplaceString(ReplaceString($String, "%x", "9"), "%y", "10"), "%size", "22 MB")
Als Beispiel werden hier fixe Angaben verwendet: 9 von 10 Dateien markiert, Größe: 22 MB


OK, hier nun die Prozedur und darunter der kleine, neue Aufruf, der en obigen 3x ReplaceString() ersetzt:

Code: Alles auswählen

Procedure.s ReplaceStrings(String$, StringsToFind$, StringsToReplace$, Separator$="|", Mode=0, StartFrom=1)
	Protected n.l
	
	For n=1 To CountString(StringsToFind$, Separator$)+1
		String$=ReplaceString(String$, StringField(StringsToFind$, n, Separator$), StringField(StringsToReplace$, n, Separator$), Mode, StartFrom)
	Next
	ProcedureReturn String$
EndProcedure



Debug ReplaceStrings("Datei %x von %y, Größe: %size", "%x|%y|%size", "9|10|22 MB")
Das wars, diese eine Zeile ist nur nötig. Die StringsToFind$ und StringsToReplace$ gibt man einfach an wie Pattern bei einem OpenFileRequester().

Lustigerweise und einfachheitshalber habe ich die Funktionen und Parameter genauso wie PB genannt, nur halt von allem die Mehrzahl:
ReplaceString() => ReplaceStrings(), usw...

Wer will, kann sich ja auch ein eigenes Trennzeichen einbauen, wenn er nicht auf das | verzichten will.



Edit: Code optimiert, kompatibel mit allen gängigen Versionen von PB.
Edit 2: Code optimiert, kompatibel mit PB 4.0 oder höher. Es werden außerdem die optionalen Parameter Mode und StartFrom von ReplaceString() unterstützt!

Re: ReplaceStrings() - Mehrere Strings aus einmal ersetzen

Verfasst: 12.07.2006 13:40
von Kiffi
> Ich habe eine Prozedur geschrieben, die mehrere Strings auf einmal
> ersetzt.

Schöne Idee! Danke dafür! :allright:

Einen kleinen Verbesserungsvorschlag habe ich noch: Wenn Du Deine
CountString()-Schleife um 1 erhöhst, dann brauchst Du zuvor nicht
StringToFind und StringToReplace mit einem abschliessenden Separator
erweitern. Des weiteren kannst Du den Separator ja auch optional
angeben lassen. Wenn er nicht angegeben wird, verwendest Du das '|',
ansonsten den angegebenen Separator.

Code: Alles auswählen

Procedure.s ReplaceStrings(String$, StringsToFind$, StringsToReplace$, Separator$="|")
  Protected n.l
  For n=1 To CountString(StringsToFind$, Separator$)+1
    String$=ReplaceString(String$, StringField(StringsToFind$, n, Separator$), StringField(StringsToReplace$, n, Separator$))
  Next
  ProcedureReturn String$
EndProcedure

String$="%x von %y Dateien markiert, Größe: %size"

Debug ReplaceStrings(String$, "%x|%y|%size", "9|10|22 MB")

Debug ReplaceStrings(String$, "%x§%y§%size", "9§10§22 MB", "§")
Grüße ... Kiffi

Re: ReplaceStrings() - Mehrere Strings aus einmal ersetzen

Verfasst: 12.07.2006 14:20
von AND51
Kiffi hat geschrieben:Wenn Du Deine
CountString()-Schleife um 1 erhöhst, dann brauchst Du zuvor nicht
StringToFind und StringToReplace mit einem abschliessenden Separator
erweitern.
Deswegen hat das ohne die manuelle Erweiterung nie funktioniert... :o

Aber naja bitte! Und danke für das lob!
Das ich die Proc im Zuge eines 3.94 Projekt entwickelt habe, kann ich leider keine optionalen Paramter direkt benutzen.

Ich hoffe, die Proc findet Anwendung... :allright:

Re: ReplaceStrings() - Mehrere Strings aus einmal ersetzen

Verfasst: 12.07.2006 14:31
von Kiffi
> Das ich die Proc im Zuge eines 3.94 Projekt entwickelt habe, kann ich
> leider keine optionalen Paramter direkt benutzen.

oh, habe ich nicht gesehen :oops:

(ist aber auch ziemlich klein, deine sig)

Grüße ... Kiffi

Verfasst: 12.07.2006 14:38
von AND51
Ist ja nicht so schlimm, siehs mal positiov, wie haben jetzt eine 3.94- version und eine 3.94+ version. was will man mehr? <)

Verfasst: 13.07.2006 10:25
von Then
Eine gute Idee ! Ich habe auch schon damit angefangen neue Striegfield Befehle zu schreiben, aber mein derzeitiges Projekt hat mich komplett in Anspruch genommen. Aber für ne neue Userlib wäre das mal ne Maßnahme. Meine Befehle :

Code: Alles auswählen

AddStringField(String, StringToFind, Wert, Trenn.) <= Addiert einem Feld einen Wert hinzu
SubStringField(String, StringToFind, Wert, Trenn.) <= Subtrahiert den WERT von einem Feld
SwapStringField(String1, Feld1, String2, Feld2, Trenn.) <= tauscht die Felder im Stringfield gegeneinander aus
...
Sowas könnte man bestimmt noch gebrauchen ... ich jedenfalls brauchte das :)

Verfasst: 13.07.2006 11:52
von AND51
Schreib doch deinen Code schon einmal hier rein, dann können wir es auch schon ohne UserLib benutzen! Deine Procs hören sich interessant an! :allright:

Verfasst: 13.07.2006 11:54
von Kaeru Gaman
wenn ihr das als include zusammensetzt, muss es auch keine UserLib werden.

...manche leute benutzen nähmlich keine...

Verfasst: 13.07.2006 11:58
von Kiffi
Kaeru Gaman hat geschrieben:wenn ihr das als include zusammensetzt, muss es auch keine UserLib werden.
... und dann ab in Thomas' IncludePack :mrgreen:

Grüße ... Kiffi

Verfasst: 13.07.2006 14:05
von remi_meier
Hab für mein jaPBdoc etwas Ähnliches gebastelt, was mehrere Zeichen
mit mehreren Strings ersetzt. Ich hatte zuerst viele ReplaceStrings()
hintereinander um einzelne Sonderzeichen mit dem HTML-Namen zu
ersetzen:

Code: Alles auswählen

;** s replacechars
;* a structure holding the chars and their strings
;* for replacement in ReplaceMultipleChars()
Structure REPLACECHARS
  chars.c[50]    ;* up to 50 chars can be defined
  strings.s[50]  ;* the replacement strings for the chars
EndStructure



;** replacemultiplechars
;* Replaces multiple chars with strings in one string
;** .String: String where chars shall be replaced
;** .*characters: A structure with chars and strings which 
;* shall be replaced by what
Procedure.s ReplaceMultipleChars(String.s, *Characters.REPLACECHARS)
  Protected *Char.CHARACTER, Result.s, z.l, Add.s, found.l
  
  If (Not String) Or (Not *characters)
    ProcedureReturn String
  EndIf
  
  *Char = @String
  While *Char\c <> 0
    Add = ""
    found = #False
    
    For z = 0 To 49
      If *Char\c = *Characters\chars[z]
        Add = *Characters\strings[z]
        found = #True
        Break
      ElseIf *Characters\chars[z] = 0
        Break
      EndIf
    Next
    
    If Not found
      Add = Chr(*Char\c)
    EndIf
    
    Result + Add
    *Char + SizeOf(CHARACTER)
  Wend
  
  ProcedureReturn Result
EndProcedure
Auch wenns nicht wirklich das Gleiche ist, einen weiteren Thread dazu
zu eröffnen, fand ich etwas übertrieben :)