Fonction StrinField()

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Fonction StrinField()

Message par kernadec »

Bonjour à tous
je vais bien! :D j’espère que vous aussi....
La commande pour récupérer les champs dans une chaine avec des délimiteurs
comme StringField(Chaine$, Index, Delimiteur$) de Purebasic n'est pas souvent prévue
dans les autres langages, elle est pourtant très pratique pour lire les fichiers.csv

voici un ptit code pour contourner cette commande ailleurs :wink:

Cordialement
kernadec

Code : Tout sélectionner

;Fonction StringField(Chaine$, Index, Délimiteur$) 

Global chaine$, nb.l, c.l, i.l

chaine$ = "10000;111.1234;222.5678;06;11;2000;a1;2;b3;4;5cd;6;7;8;9E"   ;chaine d un fichier,csv avec separateur ";"

If Right(chaine$, 1) <> ";"   
  chaine$ = chaine$+ ";"  ;test si le dernier separateur de champs est present ";" car il est obligatoire 
EndIf

Debug chaine$

nb = 0
For i = 1 To Len(chaine$) + 1
 If Right(Mid(chaine$, 1, i), 1) = ";"   ;recherche le nombre de separateur ";" dans la chaine 
   nb = nb + 1  
  EndIf
Next i

If nb <> 0
  
Dim champ$(nb)
champ$(1) = chaine$
For i = 1 To nb                          ; boucle d'extraction des champs
  c = 0
  
  Repeat
    c = c + 1 
  Until Right(Mid(champ$(i), 1, c), 1) = ";"
  champ$(1 + i)=Right(champ$(i),Len(champ$(i))-c)
  
  Debug Left(champ$(i), c - 1)               ; affichage de chaque champs 
Next i

EndIf

Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: Fonction StrinField()

Message par Marc56 »

Merci pour l'idée :)

+ le découpage de chaine existe dans presque tous les langages de haut niveau, mais s'appelle différement. Ex: Split (Perl) ou Explode (PHP > 7 mais Split avant) etc

+ Dans le cadre des fonctions sympa de PB, il y a le comptage automatique de chaines: CountString()
Donc on peut simplifier:

Code : Tout sélectionner

    ; If Right(Mid(chaine$, 1, i), 1) = ";"   ;recherche le nombre de separateur ";" dans la chaine
    ;    nb = nb + 1 
    ;   EndIf

    nb = CountString(chaine$, ";") + 1
:wink:
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Fonction StrinField()

Message par MLD »

Salut a tous
un jour j'ai eu besoin d'une fonction comme celle_ci

Code : Tout sélectionner

;MLD le 9/11/2012
; change un texte entre deux limiteurs
;PB5 et +
Procedure.s ChangeStringField(chaine$,Index,Delimiteur$,texte$)
nbd.w = 0 : lenG = 0 : lenD = 0
If chaine$ <> ""
 For i.w = 1 To Len(chaine$)
  If Mid(chaine$,i,1) = Delimiteur$
   nbd = nbd + 1
   If nbd = index -1
    lenG = i
   EndIf
   If nbd = Index
    lenDd = i
   EndIf
   lenD = i - lenDd  
  EndIf 
 Next
 If nbd => Index ;vérif qu'il y a bien le nombre de délimiteur nécéssaire pour l'appel de la fonction
  ProcedureReturn Left(chaine$,lenG) + texte$ + Right(chaine$,lenD+1)
 EndIf
EndIf    
EndProcedure

chaine$ = "Super *belle *cette *fille*"
Debug chaine$
a$ = StringField(chaine$,1,"*") + StringField(chaine$,2,"*")+StringField(chaine$,3,"*")+StringField(chaine$,4,"*")
Debug a$
chaine$ = ChangeStringField(chaine$,2,"*","moche ")
Debug chaine$
b$ = StringField(chaine$,1,"*") + StringField(chaine$,2,"*")+StringField(chaine$,3,"*")+StringField(chaine$,4,"*")
Debug b$
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Fonction StrinField()

Message par kernadec »

bjr
@Marc56 merci pour les infos sur Perl et Php :wink:
MLD merci pour le code je le range dans ma bibli..

cordialement
Répondre