StringEntry - Erweiterung von StringField
Verfasst: 27.12.2009 22:01
Tachchen,
weil ich es brauchte habe ich mal eine Erweiterung von StringField geschrieben.
StringEntry
- Auslesen von numerischen oder assoziativen (oder gemischten) Listen im String-Format
- Auslesen von Unterlisten von Listen im String-Format mittels Index-Pfad
- Alle Zeichen in Indexnamen und Werten erlaubt (außer den 4 MetaZeichen)
- Leerzeichen am Rand werden abgeschnitten!
StringEntry(String$, IndexPath$, MetaChars$="={},", DefaultValue$="")
- String$ - Irgendeine Zeichenkette mit gültigem Syntax
- IndexPath$ - Index-Pfad zu einem Feld Indizes getrennt mit \
- MetaChars$ - Benutzerdefinierte Meta-Zeichen für
* Zuweisung von Werten zu Indizes "="
* Öffnen und schließen einer Liste "{}"
* Feld-Trennzeichen ","
- DefaultValue$ - Rückgabewert bei nicht auffindbarem Index
ein leerer oder "0" Index gibt den ganze String zurück
Code:
Hier ein komplexes Beispiel:
StringEntry als StringField benutzen:
Zugriff auf die SchlüsselIndizes:
Zugriff auf Elemente einer Unterliste:
Stückweise zerkleinern:
weil ich es brauchte habe ich mal eine Erweiterung von StringField geschrieben.
StringEntry
- Auslesen von numerischen oder assoziativen (oder gemischten) Listen im String-Format
- Auslesen von Unterlisten von Listen im String-Format mittels Index-Pfad
- Alle Zeichen in Indexnamen und Werten erlaubt (außer den 4 MetaZeichen)
- Leerzeichen am Rand werden abgeschnitten!
StringEntry(String$, IndexPath$, MetaChars$="={},", DefaultValue$="")
- String$ - Irgendeine Zeichenkette mit gültigem Syntax
- IndexPath$ - Index-Pfad zu einem Feld Indizes getrennt mit \
- MetaChars$ - Benutzerdefinierte Meta-Zeichen für
* Zuweisung von Werten zu Indizes "="
* Öffnen und schließen einer Liste "{}"
* Feld-Trennzeichen ","
- DefaultValue$ - Rückgabewert bei nicht auffindbarem Index
ein leerer oder "0" Index gibt den ganze String zurück
Code:
Code: Alles auswählen
Structure CharacterArray
c.c[0]
EndStructure
Procedure.s StringEntry(String$, IndexPath$, MetaChars$="={},", DefaultValue$="")
Protected *Current.Character = @String$-1
Protected *Left.Character = @String$
Protected *Center.Character = @String$
Protected *Meta.CharacterArray = @MetaChars$
Protected Level = 0
Protected Key$ = Trim(IndexPath$) , SubIndexPath$ = ""
Protected Key, Field = 1, Value$
Protected SubKey = FindString(IndexPath$, "\", 1)
If SubKey
Key$ = Trim(Left(IndexPath$, SubKey-1))
SubIndexPath$ = Mid(IndexPath$, SubKey+1)
EndIf
If Key$ = ""
ProcedureReturn String$
Else
Key = Val(Key$)
EndIf
Repeat
*Current + SizeOf(Character)
Select *Current\c
Case *Meta\c[0]
If Not Level
*Center = *Current
EndIf
Case *Meta\c[1]
Level + 1
Case *Meta\c[2]
Level - 1
Case *Meta\c[3], 0
If Not Level
Field$ = Trim(PeekS(*Left, *Center-*Left))
If Field = Key Or Field$ = Key$
If Not Field$
Value$ = Trim(PeekS(*Center, *Current-*Center))
Else
Value$ = Trim(PeekS(*Center+1, *Current-*Center-1))
EndIf
If SubKey
If Left(Value$, 1) = Chr(*Meta\c[1])
Value$ = Trim(Mid(Value$, 2, Len(Value$)-2))
EndIf
ProcedureReturn StringEntry(Value$, SubIndexPath$, MetaChars$, DefaultValue$)
Else
ProcedureReturn Value$
EndIf
EndIf
*Left = *Current+1
*Center = *Left
Field + 1
EndIf
EndSelect
Until Not *Current\c
ProcedureReturn DefaultValue$
EndProcedure
Code: Alles auswählen
String$ = " Spieler=5, Name=Max, Position={x=10.5,y=7.2}, Waffe={{Messer, 1},{Pfeil, 150}} "
Code: Alles auswählen
Debug #DQUOTE$+StringEntry(String$, "2")+#DQUOTE$ ; Liefert "Max"
Debug #DQUOTE$+StringEntry(String$, "4")+#DQUOTE$ ; Liefert "{{Messer, 1},{Pfeil, 150}}"
Code: Alles auswählen
Debug #DQUOTE$+StringEntry(String$, "Spieler")+#DQUOTE$ ; Liefert "5"
Debug #DQUOTE$+StringEntry(String$, "Position")+#DQUOTE$ ; Liefert "{x=10.5,y=7.2}"
Code: Alles auswählen
Debug #DQUOTE$+StringEntry(String$, "Position\1")+#DQUOTE$ ; Liefert "10.5"
Debug #DQUOTE$+StringEntry(String$, "Position\y")+#DQUOTE$ ; Liefert "7.2"
Debug #DQUOTE$+StringEntry(String$, "Waffe\2\2")+#DQUOTE$ ; Liefert "150"
Code: Alles auswählen
SubString$ = StringEntry(String$, "Waffe\") ; der \ am Ende bewirkt das die außere Klammer entfernt wird
Debug #DQUOTE$+SubString$+#DQUOTE$ ; Liefert "{Messer, 1},{Pfeil, 150}"
Debug #DQUOTE$+StringEntry(SubString$, "2\1")+#DQUOTE$ ; Liefert "Pfeil"