Traitement de chaînes - Instruction StringField étendue

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Traitement de chaînes - Instruction StringField étendue

Message par Ollivier »

Voilà, j'étais un peu freiné avec l'instruction StringField() car elle permet des découpes de chaîne avec des séparateurs d'un seul caractère.
Donc voici un code qui permet de récupérer des champs en ayant des séparateurs de plusieurs caractères.

J'avais le possibilité de faire une seule et unique procédure claire et nette. Seulement, j'ai préféré la vitesse de calcul au confort du simplissime.

Pour procéder:

1) Définir la structure avec Define

2) Initialiser la recherche avec FieldSetting()
Arg1 Pointeur de structure
Arg2 Chaîne à explorer
Arg3 Position initiale (0)
Arg4 Chaîne de séparation

3) Effectuer la recherche avec NextField()
>> L'argument est le pointeur de la structure STRINGFIELDEX

Code : Tout sélectionner

Structure STRINGFIELDEX
  String.S
  Separator.S
  SepLength.L
  Cursor.L
EndStructure

Procedure.S NextField(*Ptr.STRINGFIELDEX)

  Protected Result.S
  Protected i.L
  Protected OldCursor.L

  OldCursor = *Ptr\Cursor
  *Ptr\Cursor = FindString(*Ptr\String, *Ptr\Separator, *Ptr\Cursor + 1)
  If OldCursor = 0
    Result = Mid(*Ptr\String, 1, *Ptr\Cursor - 1)
  Else
    Result = Mid(*Ptr\String, OldCursor + *Ptr\SepLength, *Ptr\Cursor - OldCursor - *Ptr\SepLength)
  EndIf

  ProcedureReturn Result
  
EndProcedure

Procedure FieldSetting(*Ptr.STRINGFIELDEX, String.S, Cursor, Separator.S)

  *Ptr\String = String
  *Ptr\Cursor = Cursor
  *Ptr\Separator = Separator
  *Ptr\SepLength = Len(*Ptr\Separator)

EndProcedure


;*************************
;- Un petit exemple...
;*************************

  Define SFE.STRINGFIELDEX ; (1)
  Define x.S
    
  x.s = "gtabonjourgtaau revoirgtaah bon?gta"

  FieldSetting(SFE, x, 0, "gta") ; (2)
  
  For i = 1 To 6
    Debug "«" + NextField(SFE) + "»"  ; (3)
  Next i