Connaitre la position d'un mot dans une phrase[Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Connaitre la position d'un mot dans une phrase[Résolu]

Message par Kwai chang caine »

Bonjour la famille :D

Je sais, je sais tout le monde se dit, si KCC y sait encore pas faire un "FindString" on est pas sorti des haricots :?
Et bah figurez vous que ça fait "seulement" deux heures que je tourne en rond et que je trouve pas.
Je voudrais faire un "MegaStringField", parce que natif est un peu court :?

J'aimerais en faire un qui aurait toutes ces fonctions que l'original n'a pas bien sur :

1/ Possibilité de mettre plusieurs caracteres separateurs
2/ Possibilité de mettre plusieurs separateurs de plusieurs caracteres
3/ Possibilité de retourner soit la valeur du champ comme le natif, mais aussi l'emplacement de ce dernier

Et c'est surtout sur la 3e fonction que je merdoie :oops:
J'arrive pas à faire remonter cette position de ¤$£ùù%*#=+ dans le cas ou bien sur il y a plusieurs champs identiques.

Car quand on fait un FindString on a le champ, mais comment retourner sa position a coup sur :roll:
On voit bien que dans mon exemple, que le champ LL est deux fois placé, et je n'arrive pas a avoir les deux positions (Normal dans les deux cas j'ai la derniere position, puisque la boucle en 34/37 me la donne, et si je l'enleve bah j'ai 2 fois la premiere position)

J'ai eu l'idée, de remplacer tous les separateurs par un unique, pour la facilité de comptage des champs, mais j'suis pas sur que ce soit la bonne methode :roll:

Si quinquin y connait une meilleure methode, ou peut modifier l'espece de pierre brute que j'ai extirpé de la terre boueuse, pour le tailler et en faire un diamant de 120 carats qu'on peux fourguer direct chez cartier,........... j'suis preneur ......et on partage :D

Code : Tout sélectionner

#Field_Valeur = 1
#Field_Position = 2

ProcedureDLL.s KCC_StringField(Phrase.s, Position, Separateurs.s, TypeRetour = 1) ; TypeRetour = #Field_Valeur / #Field_Position
 
 ; Decoupe des separateurs
 Dim TabloSeparateur.s(100)
  
 For NbreSeparateurs = 1 To CountString(Separateurs, "|") + 1
  TabloSeparateur(NbreSeparateurs) = StringField(Separateurs, NbreSeparateurs, "|")
 Next
 
 ; Tri du tableau afin de commencer par le separateur qui contient le plus de caracteres
 SortArray(TabloSeparateur(), #PB_Sort_Descending)
 
 ; Remplacement des divers separateurs par un separateur unique
 Temp$ = Phrase
 
 For i = 0 To NbreSeparateurs
  Temp$ = ReplaceString(Temp$, TabloSeparateur(i), "@")
 Next
 
 ; Retrait du premier caractere pour eviter le decalage des champs de 1
 If Left(Temp$, 1) = "@"
  Temp$ = Mid(Temp$, 2)
 EndIf
 
 ; Recuperateur du champ désiré 
 Champ$ = StringField(Temp$, Position, "@")
 
 ; Recherche du bon champs au cas ou il y en aurait plusieurs du meme nom
 PositionChamp = 0
 
 Repeat
  DernierePosition = PositionChamp
  PositionChamp = FindString(Phrase, Champ$, PositionChamp + 1)
 Until Not PositionChamp
 
 Select TypeRetour 
 
  Case #Field_Valeur
   ProcedureReturn Champ$ 
  Case #Field_Position
   ProcedureReturn Str(DernierePosition)
 EndSelect  

EndProcedure

For i = 1 To 15
 Debug KCC_StringField("[NL]Bal[LL][CR]Pro[LL]E:\MES DOCUMENTS\Dll et Modules[LL]Pro[Bien]Manger", i, "[|][|]",#Field_Valeur)
 Debug KCC_StringField("[NL]Bal[LL][CR]Pro[LL]E:\MES DOCUMENTS\Dll et Modules[LL]Pro[Bien]Manger", i, "[|][|]",#Field_Position)
 Debug ""
Next
Merci de votre aide
Bonne journée et bon "Semaine fin" (Restont français :lol:)
Dernière modification par Kwai chang caine le dim. 18/janv./2009 19:13, modifié 3 fois.
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message par case »

la vache ça fait peur un peu des fois un code de kcc :)

bon je viens d'y reflechir un peu, je rentre du taf donc desole pour le delai et voila mon code :)

Code : Tout sélectionner


Declare.s case_fieldstring(string$,sep$,index)

result$= Case_fieldstring("Je, vais a la : peche",",:",3)
Debug "string retournée   : "+StringField(result$,1,Chr(1))
Debug "position retournée : "+StringField(result$,2,Chr(1))

Procedure.s case_fieldstring(string$,sep$,index)
; sur une idee de kcc
  ind=1        ; index actuel
  pos=0        ; position dans la chaine en memoire
  fieldstart=1 ; debut du premier field
  Repeat
    C=PeekB(@string$+pos)       ; lis le caractere courant
    If c<>0
      If FindString(sep$,Chr(c),1)    ; le caractere actuel est dans la chaine de separateurs ( on change de field )
        If index=ind              ; on est deja dans le bon champ on renvois la chaine et la position
          ProcedureReturn(Mid(string$,fieldstart,(pos+1)-fieldstart))+Chr(1)+Str(fieldstart)
        Else
          ind=ind+1
          pos=pos+1
          fieldstart=pos+1
        EndIf
      Else
        pos=pos+1
      EndIf
    EndIf
    Until c=0 ; fin de ligne
    If index=ind              ; on est deja dans le bon champ on renvois la chaine et la position
       ProcedureReturn(Mid(string$,fieldstart,(pos+1)-fieldstart))+Chr(1)+Str(fieldstart)
    EndIf
EndProcedure

je sais pas du tout si ça fera l'affaire je connais rien au dll et tout le toutim
ImageImage
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Merci beaucoup case 8)
Je regarde ça tout de suite :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Top du top, je t'aime CASE :D

ça marche trop de la balle d'enfer !!!!
Je ne sais pas pourquoi, mais ça marche.
Je vais donc essayer de comprendre pourquoi, et le mettre à ma sauce.

Trois fois moins de code et ça marche, comme dab KCC il est parti à l'envers j'ai encore l'impression :?

Encore mille merci de ton aide tres precieuse
Passe une excelente soirée
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message par case »

met le pas trop a ta sauce quand même :p
ImageImage
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

J'ai encore un petit probleme, et pourtant je l'ai pas trop saucer, je l'ai juste inséré dans ma 2 CV
J'ai donc mis ton moteur de porsche dans ma deux chevaux, et elle demarre pas encore au feu rouge tout à fait comme une porsche :cry:

Avec ce code, j'obtiens ce resultat

Code : Tout sélectionner

NL
Bal
LL

CR
Pro
LL
E:\MES DOCUMENTS\Dll et Modules
LL
Pro
Bien
Manger
Ce qui veut dire

Code : Tout sélectionner

Champ n°1 = NL
Champ n°2 = Bal
Champ n°3 = LL
Champ n°4 = 
Champ n°5 = CR
Champ n°6 = Pro
Champ n°7 = LL
Champ n°8 = E:\MES DOCUMENTS\Dll et Modules
Champ n°9 = LL
Champ n°10 = Pro
Champ n°11 = Bien
Champ n°12 = Manger
Or on s'apperçoit bien que dans la phrase

Code : Tout sélectionner

"[NL]Bal[LL][CR]Pro[LL]E:\MES DOCUMENTS\Dll et Modules[LL]Pro[Bien]Manger"
Le 4e champs est CR
C'est normal car ton code voit l'espace nul entre le "][" avant le CR
J'avais aussi le meme probleme, c'est pour ça que j'avais remplacé les "][" et "]" et "[" par un seul caractere "@" pour eviter ce genre de decalage.

Comment pourrais tu eviter ce decalage ????
Et aussi, comment ferais tu pour sortir la balise complete si s'en est une ou le texte si s'en ai un

Exemple

Dans ma ligne "[NL]Bal[LL][CR]Pro[LL]E:\MES DOCUMENTS\Dll et Modules[LL]Pro[Bien]Manger"

[NL] est une balise
Bal est un texte
[LL] est une balise
[CR] est une balise
Pro est un texte
[LL] est une balise
E:\MES DOCUMENTS\Dll et Modules est un texte
[LL] est une balise
Pro est un texte
[Bien] est une balise
Manger est un texte

Donc en fin de compte le resultat que j'aurais révé retrouver à la sortie de ma boucle :

Code : Tout sélectionner

For i = 1 To 15
 Debug CaseCC_StringField("[NL]Bal[LL][CR]Pro[LL]E:\MES DOCUMENTS\Dll et Modules[LL]Pro[Bien]Manger", i, "[|][|]",#Field_Valeur)
; Debug RE_StringField("[NL]Bal[LL][CR]Pro[LL]E:\MES DOCUMENTS\Dll et Modules[LL]Pro[Bien]Manger", i, "[|][|]",#Field_Position)
 ;Debug ""
Next
aurait été de :

Code : Tout sélectionner

[NL]
Bal
[LL]
[CR]
Pro
[LL]
E:\MES DOCUMENTS\Dll et Modules
[LL]
Pro
[Bien]
Manger
Ce qui veut dire

Code : Tout sélectionner

Champ n°1 = [NL]
Champ n°2 = Bal
Champ n°3 = [LL]
Champ n°4 = [CR]
Champ n°5 = Pro
Champ n°6 = [LL]
Champ n°7 = E:\MES DOCUMENTS\Dll et Modules
Champ n°8 = [LL]
Champ n°9 = Pro
Champ n°10 = [Bien]
Champ n°11 = Manger
Voici ce que j'ai fait de ton super code :oops:
J'suis fier que d'une chose, c'est le jeu de mot :"CaseCC" :D

Code : Tout sélectionner

#Field_Valeur = 1
#Field_Position = 2

ProcedureDLL.s CaseCC_StringField(Phrase.s, Position, Separateurs.s, TypeRetour = #Field_Valeur) ; TypeRetour = #Field_Position / #Field_Valeur
 
 Position + 1
 Ind = 1        ; Position actuel 
 Pos = 0        ; Position dans la chaine en memoire 
 Fieldstart = 1 ; Debut du premier field 
 
 Repeat 
 
  c = PeekB(@Phrase + Pos)   ; Lis le caractere courant 
 
  If c <> 0 
 
   If FindString(Separateurs, Chr(c), 1)  ; Le caractere actuel est dans la chaine de separateurs ( on change de field ) 

    If Position = Ind   ; On est deja dans le bon champ on renvois la chaine et la Position 
 
     Break 
     ;ProcedureReturn(Mid(Phrase, Fieldstart, (Pos + 1) - Fieldstart)) + Chr(1) + Str(Fieldstart) 
 
    Else 
 
     Ind = Ind + 1 
     Pos = Pos + 1 
     Fieldstart = Pos + 1 
 
    EndIf 

   Else 
  
    Pos = Pos + 1 
  
   EndIf 
  
  EndIf 
  
 Until c = 0 ; Fin de ligne 
  
 If Position = Ind              ; On est deja dans le bon champ on renvois la chaine et la Position 

  Select TypeRetour 
 
   Case #Field_Valeur
    
    ProcedureReturn Mid(Phrase, Fieldstart,(Pos + 1) - Fieldstart)
       
   Case #Field_Position
    
    ProcedureReturn Str(Fieldstart)
    
  EndSelect  

  ;ProcedureReturn(Mid(Phrase, Fieldstart,(Pos + 1) - Fieldstart)) + Chr(1) + Str(Fieldstart) 
 EndIf 
  
EndProcedure

For i = 1 To 15
 Debug CaseCC_StringField("[NL]Bal[LL][CR]Pro[LL]E:\MES DOCUMENTS\Dll et Modules[LL]Pro[Bien]Manger", i, "[|][|]",#Field_Valeur)
; Debug RE_StringField("[NL]Bal[LL][CR]Pro[LL]E:\MES DOCUMENTS\Dll et Modules[LL]Pro[Bien]Manger", i, "[|][|]",#Field_Position)
 ;Debug ""
Next
Merci de ton aide ou celle des autres evidemment 8)
Anonyme

Message par Anonyme »

Tu parles de balise <mabalise> blablala <mabalise/>
tu veut extraire entre les balises voulue ?
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message par case »

ce qui est bien avec KCC c'est qu'il nous dit pas ou il veux en venir , remarque peut etre que c'est mieux de pas savoir :)

si j'ai bien compris , si il y a un truc genre [LL][CR] dans ta chaine

tu veux qu'il retourne LL et CR alors que mon code renvois entre les deux une chaine vide ?
ImageImage
Anonyme

Message par Anonyme »

Bon je donne quand même ma p'tite fonction récursive :

elle extrait des balise prédéfinie , pratique pour du parsing de page html ou xml , bref , tout ce qui est à base de balise :D

Code : Tout sélectionner

#BALISE_KCC_START = "<kcc>"
#BALISE_KCC_END     = "<kcc/>"
#BALISE_PHP_START = "<?php"
#BALISE_PHP_END     = "?>"


Global NewList Champ$()   ; les résultats seront stocké ici


A$ = "<kcc> Cool <kcc/><kcc> 2° Balise <kcc/><?php echo 'un peu de php...';?><kcc>une dernière<kcc/> "


Procedure ExtractBalise(Text$,BaliseA$,BaliseB$,Call=0)

    Copy$ = Text$
    
    ;On cherche le début de balise
    PosA = FindString(Copy$,BaliseA$,1) 
    
    ; On a trouvé le début de la balise
    If PosA>0
    
      ; on récupère la partie droite de la balise , tout se qui est avant est supprimer
       Copy$ = Mid(Copy$,PosA,Len(Copy$)-PosA)

      
      ; On cherche la balise de fermeture
      PosB = FindString(Copy$,BaliseB$,1) 
      
      
      If PosB>0
        Copy$ = Mid(Copy$,0,PosB+Len(BaliseB$)-1)
        RecursiveText$ = RemoveString(Text$,Copy$)
        Copy$ = RemoveString(Copy$,BaliseA$)
        Copy$ = RemoveString(Copy$,BaliseB$)
      
          AddElement(Champ$())
          Champ$() = Copy$
          ExtractBalise(RecursiveText$,BaliseA$,BaliseB$)
      
      Else
        Debug "La balise "+BaliseB$+" est manquante !"
      EndIf

    EndIf   
  
EndProcedure



ExtractBalise(A$ ,#BALISE_KCC_START,#BALISE_KCC_END)
ForEach Champ$()
Debug Champ$()
Next 
Dernière modification par Anonyme le sam. 17/janv./2009 11:56, modifié 1 fois.
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message par case »

je reposte mon code sans les modifications de kcc ;) mais avec la prise en compte des cas posant problème a kcc .

il devrais pouvoir le réadapter a sa sauce :)

allez KCC courrage :)

je l'ai commenté a fond tu peux pas te louper tout est expliqué pas a pas

Code : Tout sélectionner

Declare.s case_fieldstring(string$,sep$,index)
For field=1 To 15
result$= Case_fieldstring("[NL]Bal[LL][CR]Pro[LL]E:\MES DOCUMENTS\Dll et Modules[LL]Pro[Bien]Manger","[|][|]",field)
Debug "string retournée   : "+StringField(result$,1,Chr(1))
Debug "position retournée : "+StringField(result$,2,Chr(1))
Next 
Procedure.s case_fieldstring(string$,sep$,index)
  ind=1                                                 ; index de depart
  pos=-1                                                ; position dans la chaine en memoire (-1 car on vas ajouter 1  avant de rechercher  du fait de la boucle)
  ;+------------------------------------------------------------------------------------------------------------------------------+
  ;!                                             detection du premier champ a retourner                                           !
  ;! parceque KCC il met des separateurs des le debut de ses chaines :) mais c'est quand meme bien de tester ca dans tout les cas !
  ;!                                                                                                                              !
  ;!               donc on vas lire la memoire jusqu'a ce que le caractere ne soit pas dans la chaine et on le definit comme                                                                                                               !
  ;!                                                                                                                              !
  ;!                debut du premier champ ! comme ca on peux metre un separateur des le debut , ou pas                                                                                                              !
  ;!                                                                                                                              !
  ;+------------------------------------------------------------------------------------------------------------------------------+
  
  Repeat                                                                                               ; recherche deu debut de la premiere chaine  
    pos=pos+1                                                                                           ; on ajoute 1 a la position en memoire
    c=PeekB(@string$+pos)                                                                               ; on lis le caractere courant
  Until FindString(sep$,Chr(c),1)=0                                                                     ; on sort de la boucle des que le caractere lu n'est pas dans les separateurs
  ; on a trouvé !! 
  fieldstart=pos+1                                                                                      ; debut du premier champ (+1 car dans un string on commence a 1 la numerotation)
  ;+------------------------------------------------------------------------------------------------------------------------------+
  ;!                              la on commence les choses serieuses pour bien tout detecter :)                                  !                                                              !
  ;!                              parceque KCC il utilise des separateurs cote a cote                                             !                                                                                                !
  ;+------------------------------------------------------------------------------------------------------------------------------+
  ;
  Repeat
    C=PeekB(@string$+pos)                                                                               ; lis le caractere courant
    If c<>0                                                                                             ; si ce n'est pas un caractere de fin de ligne (ZERO)
      ;
      If FindString(sep$,Chr(c),1)                                                                      ; le caractere actuel est dans la chaine de separateurs 
                                                                                                        ;on arrive a la fin d'un champ (vu qu'on etait forcement au debut avant ca)
        endfield=pos                                                                                    ; on garde la position de fin de champ pour renvoyer la chaine ensuite
       ;pos=pos-1                                                                                        ; on enleve un a la position parcequ'apres on vas encore ajouter 1 
        If index=ind                                                                                    ; on est deja dans le bon champ on renvois la chaine et la position
          ProcedureReturn(Mid(string$,fieldstart,(endfield+1)-fieldstart))+Chr(1)+Str(fieldstart)      ; la je renvoi ma chaine et ma position dans un stringfield separe par un chr(1)
        Else                                                                                             ; on est pas dans le bon champ , on continue de lire la chaine en memoire
  ;+------------------------------------------------------------------------------------------------------------------------------+
  ;!       on prend les memes et on recommence, bah vi on peux garce a KCC avoir plusieur separateurs cote a cote                 !                                                              !
  ;!                              parceque KCC il utilise des separateurs cote a cote                                             !                                                                                                !
  ;+------------------------------------------------------------------------------------------------------------------------------+       
        Repeat                                                                                          ; recherche du debut de la chaine suivante
          pos=pos+1                                                                                      ; on ajoute 1 a la position en memoire
          c=PeekB(@string$+pos)                                                                          ; on lis le caractere courant
        Until FindString(sep$,Chr(c),1)=0                                                               ; on sort de la boucle des que le caractere lu n'est pas dans les separateurs
          ind=ind+1                                                                                      ;on ajoute 1 a l'index 
          fieldstart=pos+1                                                                               ; debut du champ (+1 car dans un string on commence a 1 la numerotation)
        EndIf
      Else                                                                                               ; le caractere actuel n'est pas dans la chaine de separateurs 
        pos=pos+1                                                                                         ; on avance
      EndIf
    EndIf
    Until c=0                                                                                             ; fin de ligne
    If index=ind              ; on est deja dans le bon champ on renvois la chaine et la position
       ProcedureReturn(Mid(string$,fieldstart,(pos+1)-fieldstart))+Chr(1)+Str(fieldstart)
    EndIf
EndProcedure


et je vais dormir parce que Case, il travail tôt demain :)
ImageImage
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

case a écrit :la vache ça fait peur un peu des fois un code de kcc :)
Ha oui Ha oui :mrgreen:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Excusez moi pour cette reponse tardive, mais j'ai été obligé de sortir un peu ma femme hier :?
Mais j'avais la tete dans les codes, seulement KCC il est pas encore relié HEAD WIFI et donc il a pas pu vous repondre.
Remarquez, je sais pas si j'suis relié a quelque chose d'ailleurs :roll:

Tout d'abord merci à tous les amis, de votre aide 8) (Meme DENIS :? :lol: :lol:)
Tu parles de balise <mabalise> blablala <mabalise/>
tu veut extraire entre les balises voulue ?
Oui c'est un peu ça, je suis en train de me faire un editeur de fichiers de parametres commun a toutes mes applis actuelles et futures.
Pour ça, y'a fallu que je trouve un "Language"
Et parce que je le crypte apres, j'ai essayé de le faire le plus succint possible.
Parce que beaucoup de cryptages ont tendance à allonger le texte d'origine :roll:
J'ai donc décider de le faire un peu comme le HTML mais de supprimer les balises de fin, qui me sont inutiles :

Code : Tout sélectionner

[CR][I]Bla bla[/I][/BR] <----- Non accépté par la KCC fondation entreprise copyright 
:D

J'ai donc orchestré mon language comme ça :
Il existe deux type de balises, les TEXTES et les FORMATS

Les FORMATS

Code : Tout sélectionner

[CR] = Caracteres rouges
[I] = Inactif
Etc ....
Les TEXTES

Code : Tout sélectionner

[NL] = Nom du logiciel
[VL] = Version logiciel
Etc ....
Les balises formats n'ont jamais de VALEUR
Les Balises TEXTES peuvent en avoir une, et servent à en avoir une.

Avec ces balises, je créé des StringGadgets et combo au fur et a mesure de la lecture
Cela donne :

Code : Tout sélectionner

[KCC][CR]Est une burne[KCC2][I]Et encore une mauvaise burne car une burne c'est rond et KCC y tourne pas rond
ça créé donc le TextGadget "KCC" et le StringGadget qui ecris en rouge "Est une burne" et ensuite le TextGadget "KCC2" et le StringGadget inactif donc qu'il est impossible de modifier "Et encore une mauvaise burne car une burne c'est rond et KCC y tourne pas rond"
Etc ....

Au debut, KCC, il avait fait à l'envers comme DAB, et il s'est retrouvé a mettre un format sur des gadgets qui n'existaient pas encore :?
Donc un gestion avec des tableaux, des cloux un marteau pour les pendrent, enfin bref une vraie daube.
Et KCC il aime pas la daube, sauf dans son assiette avec des petits lardons et ....heu !!!heu !!! C'est pas le probleme :?
Les freres y ont surement des femmes à sortir aussi et y ont pas que ça a faire de lire KCC et ses problemes culinaires de daube et de lardons :?

Donc Balise du texte concerné, toutes les autres balises de formats, et on referme le bin's par un texte qui n'a pas de balise, c'est a ça qu'on le reconnait et qui est la valeur de la stringGadget :D

Vala vala .... :D
Le gentil CASE a écrit :ce qui est bien avec KCC c'est qu'il nous dit pas ou il veux en venir , remarque peut etre que c'est mieux de pas savoir
si j'ai bien compris , si il y a un truc genre [LL][CR] dans ta chaine
tu veux qu'il retourne LL et CR alors que mon code renvois entre les deux une chaine vide ?
Oui tu as raison :oops:
Et parfois KCC, il est lui meme aussi perdu qu'un groupe de nones dans un sex-Sop :oops:

Mais en fait, c'est pour pas trop vous embeter, j'essaie de poser mon probleme dans un code le plus simple possible (Apparement c'est loupé :oops:) afin de pas trop vous prendre de temps.
Et aller à l'essentiel, jusqu'a la prochaine tuile.
D'ailleurs, KCC, il aurait du faire charpentier avec toutes les tuiles qui lui arrivent gratuit :roll:

Mais quand j'essaie d'adapter le super code que vous me donnez, un peu comme un bijou que l'on poserait dans une bouse de vache :oops:
J'me rend compte que j'ai oublié de dire un petit detail, qui fait que le genial code, ne fait pas tout à fait ce que tout mon programme demande :?

Voila pourquoi on a l'impression que je change d'avis, ce qui n'est pas le cas.

Bon, je doit aussi ajouter à cela, que je travaille dans une boite qui ne veux pas trop que certaines informations se promennent et soit lues par tout le monde, alors KCC, il essaie de parler de quelque chose, qu'il n'a pas le droit de tout dire :cry:

Alors c'est pas toujours tout rose comme le petit goret qui viens de naitre la vie de KCC :roll:

Image

Il pourrait donc poser ces question en MP, pour la confidentialité
Mais KCC, il a compris le fontionnement du FORUM (Pour une fois qui comprend quelque chose)
C'est pour ça qu'il demande presque jamais par les MP.
C'est celui qui a envie d'aider KCC qui le fait, et KCC y veut pas forcer personne, on est pas dans un magasin :?

Bonjour Mr le FORUM

Bonjour Mr KCC

Alors qu'est ce que je vous sert aujourd'hui

Bah je voudrais une fonction megastring, avec tout le jus dedans.

ça tombe bien j'ai de la CASE et de la CPLBATOR aujourd'hui

Alors mettez m'en une, comme ça j'la jete dans mon sac et pour demain j'voudrais une fonction qui coupe les mots dans le sens de la longueur.

Et bah revenez demain je fait la commande


Ca c'est pas bien y faut aussi que KCC se fasse un peu chier .......et ça marche ......il en chie :D
Mais parfois, à force, il a plus rien dans son ventre :oops:
Alors c'est la, que les freres y viennent avec un super rouleau de PQ qui brille, et tout propre, qu'ils sauvent KCC qui peut se relever de son buisson :oops:

Et de ça KCC y veut encore vous remercier, et ne cessera jamais de le faire
case a écrit:
la vache ça fait peur un peu des fois un code de kcc
Ha oui Ha oui
Dis donc DENIS :?
T'as pas honte de rigoler comme une baleine qui a gagné au loto du "plancton gagnant"
Pendant que tes autres freres, y ont les mains pleines de cambouis pour aider le pauvre KCC qui reflechi noir (Comme le camboui d'ailleurs :roll: ) avec son bineurone tout irrité :? :lol: :lol: :lol:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

@CASE
Au premier abord ça a l'air d'etre exactement ce que je cherche cette fois.
Mais je vais verifier et je reviens pour tout vous dire

@CPL
Merci aussi, je vais regarder, ça peut surement aussi m'etre utile.
Avec moi, rien n'est toujours trop :oops:

Bon appetit,, a tout a l'heure
Milles merci....je vous aime
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Yaaaahhhoooo !!!

Mille millions de sabords de merci à toi CASE 8)
Je crois que cette fois, c'est la bonne (Croisage de doigts et de narpions)

Je remercie encore tous ceux aussi qui m'ont aidé dans cette perilleuse aventure :D (Meme DENIS) :lol:

Voici donc le code "made in CASE" à la sauce grand merdeur de KCC :D
Sentez moi ce fumet ........

Code : Tout sélectionner

#Field_Valeur = 1
#Field_Position = 2

ProcedureDLL.s CaseCC_StringField(Phrase.s, Position, Separateurs.s, TypeRetour = #Field_Valeur)
 
 Ind = 1                                                 ; Position de depart 
 Pos = - 1                                                ; Positionition dans la chaine en memoire (-1 car on vas ajouter 1  avant de rechercher  du fait de la boucle) 
 
 Repeat                                                                                               ; recherche deu debut de la premiere chaine  
  Pos = Pos + 1                                                                                           ; on ajoute 1 a la Positionition en memoire 
  c = PeekB(@Phrase + Pos)                                                                               ; on lis le caractere courant 
 Until FindString(Separateurs, Chr(c), 1) = 0                                                                     ; on sort de la boucle des que le caractere lu n'est pas dans les separateurs 
 ; on a trouvé !! 
 Fieldstart = Pos + 1                                                                                      ; debut du premier champ (+1 car dans un string on commence a 1 la numerotation) 
 
 Repeat 
   
  c = PeekB(@Phrase + Pos)                                                                               ; lis le caractere courant 
  
  If c <> 0                                                                                             ; si ce n'est pas un caractere de fin de ligne (ZERO) 
     
   If FindString(Separateurs, Chr(c), 1)                                                                      ; le caractere actuel est dans la chaine de separateurs 
                                                                                                      ;on arrive a la fin d'un champ (vu qu'on etait forcement au debut avant ca) 
    Endfield = Pos                                                                                    ; on garde la Positionition de fin de champ pour renvoyer la chaine ensuite 
       
    If Position=Ind                                                                                    ; on est deja dans le bon champ on renvois la chaine et la Positionition 
   
     Break
   
    Else                                                                                             ; on est pas dans le bon champ , on continue de lire la chaine en memoire 
    
     Repeat                                                                                          ; recherche du debut de la chaine suivante 
      Pos = Pos + 1                                                                                      ; on ajoute 1 a la Positionition en memoire 
      c = PeekB(@Phrase + Pos)                                                                          ; on lis le caractere courant 
     Until FindString(Separateurs, Chr(c), 1) = 0                                                               ; on sort de la boucle des que le caractere lu n'est pas dans les separateurs 
    
     Ind = Ind + 1                                                                                      ;on ajoute 1 a l'Position 
     Fieldstart = Pos + 1                                                                               ; debut du champ (+1 car dans un string on commence a 1 la numerotation) 
   
    EndIf 

   Else                                                                                               ; le caractere actuel n'est pas dans la chaine de separateurs 
 
    Pos = Pos + 1                                                                                         ; on avance 
 
   EndIf 
 
  EndIf 
 
 Until c = 0                                                                                             ; fin de ligne 
 
 If Position = Ind              ; on est deja dans le bon champ on renvois la chaine et la Positionition 

  Select TypeRetour 
 
   Case #Field_Valeur
    
    Valeur$ = Mid(Phrase, Fieldstart, (Pos + 1) - Fieldstart)
   
    If Mid(Phrase, FieldStart - 1, 1) = "[" And Mid(Phrase, FieldStart + Len(Valeur$), 1) = "]"
     Valeur$ = "[" + Valeur$ + "]"
    EndIf 
    
    ProcedureReturn Valeur$
           
   Case #Field_Position
    
    ProcedureReturn Str(Fieldstart) 
    
  EndSelect  
  
 EndIf 
  
EndProcedure

For i = 1 To 15

 Debug CaseCC_StringField("[NL]Bal[LL][CR]Pro[LL]E:\MES DOCUMENTS\Dll et Modules[LL]Pro[Bien]Manger", i, "[|][|]", #Field_Valeur)
 Debug CaseCC_StringField("[NL]Bal[LL][CR]Pro[LL]E:\MES DOCUMENTS\Dll et Modules[LL]Pro[Bien]Manger", i, "[|][|]",#Field_Position)
 Debug ""
 
Next
Grosses bises à tous
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Message par GeBonet »

Autre possibilité...


;------------------------------------------------------------------------------------
; Voilà une forme assez simple si effectivement tu place tes marqueurs entre [ ]
;------------------------------------------------------------------------------------
Chaine$= "[NL]Bal[LL][CR]Pro[LL]E:\MES DOCUMENTS\Dll et Modules[LL]Pro[Bien]Manger"
Nbr_Marqueur= countstring (Chaine$, "[" ):G0=1: D0=1

Dim Marqueur.s(Nbr_Marqueur) ; si on veux garder les données alors on dimensionne
Dim Donne.s(Nbr_Marqueur) ;
Dim Mg.i(Nbr_Marqueur) ; Position des marqueurs
Dim Md.i(Nbr_Marqueur) ;

Debug "Décodage de la chaine : "
Debug "================================================================"
Debug Chaine$
Debug "================================================================"

For i=1 To Nbr_Marqueur
    G1= findstring (Chaine$, "[" ,G0):G2= findstring (Chaine$, "[" ,G1+1):G0=G2 ; Les valeurs G2 et
    D1= findstring (Chaine$, "]" ,D0): D2= findstring (Chaine$, "]" ,D1+1): D0=D2 ; D2 sont des déplacements
     If i>1
        Donne$= mid (Chaine$,DonG,G1-DonG) ; Pour mémoriser la donné
         Debug Position$+ " Donnée = " +Donne$ ; on a besoin du deuxième pointeur de deuxième position
        Donne.s(i-1)=Donne$
     EndIf
    Marq$= mid (Chaine$,G1+1,D1-G1-1)
     Debug "Position Marqueur : " +Marq$+ " = " + str (G1)+ "," + str (D1)
    DonG=D1+1 ; Memorise pour la ligne suivante (INDEX)
     ; --------- Partie pour mémoriser -- SI on veux utiliser bien évidement ---------------
    Mg.i(i)=G1:Md.i(i)=D1
    Marqueur.s(i)=Marq$
     ;--------------------------------------------------------------------------------------
Next i
Donne$= mid (Chaine$,D1+1)
Donne.s(i-1)=Donne$
Debug Position$+ " Donnée = " +Donne$
End
;
; C'EST TOUT .....
;

Répondre