[resolu]Je cauchemarde avec FindString !

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

[resolu]Je cauchemarde avec FindString !

Message par Ar-S »

Salut à tous.
Tout d'abord bon week end à vous, je m'apprête à aller faire des courses pour aller bricoler dans mon petit jardin, mais avant cela, je vais lancer mon appel à l'aide.

En effet, je galère avec FindString.

Mon objectif est simple, je souhaite que le contenu d'un editorgadget (en gros du texte) soit lu et que tous les caractères de A à B soient affichés.

exemple :

Code : Tout sélectionner

A$="les"
B$="jouets"
Si mon editor1 contient le texte :

les jouets c'est chouette j'aime les beaux jouets

L'editor 2 devra afficher :

2 occurrences trouvées

les jouets
les beaux jouets

----------

Voilà, comment traduire ça en PB ?

Dois-je utiliser quelquechose comme

Code : Tout sélectionner

debut$ = FindString(Contenu$, A$, 1)
Je galère vraiment, je trouve rien dans la doc ni avec notre pauvre "rechercher" donc si vous pouviez m'éclairer sur ce point crucial qu'est la "recherche" de caractères du caractère A au caractère B" je serrai bien heureux :)

Merci
Dernière modification par Ar-S le dim. 16/sept./2007 18:25, modifié 1 fois.
Jeff
Messages : 72
Inscription : sam. 13/mai/2006 18:09

Message par Jeff »

je suis pas sur d'avoir tout compris. :roll:

Peux-tu clarifier ?

JF
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

FindString te retourne une position, et rien d'autre.

Il ne suffit pas de lire l'aide. Il faut aussi essayer de la comprendre.
FindString()

Syntaxe

Position = FindString(Chaine$, ChaineCherchee$, PositionDepart)
Description

Essaie de trouver la 'ChaineCherchee$' dans la chaîne 'Chaine$', à partir de la position 'PositionDepart'. Si 'ChaineCherchee$' est trouvée, sa position (en nombre de caractères commençant à 1) est renvoyée dans 'Position'. Si 'ChaineCherchee$' n'est pas trouvée, la valeur renvoyée est 0.


Exemple:

Position = FindString("PureBasic", "Bas", 1) ; 'Position' recevra la valeur 5

OS Supportés

Tous
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Code : Tout sélectionner

;A$="les"
A$ = "jouets"

S$ = "les jouets c'est chouette j'aime les beaux jouets"

i= 1

Repeat
  pos = FindString( S$, A$, i)
  If pos
    Debug Mid(S$, pos, Len(A$))
    i + pos
  Else
    Break
  EndIf
ForEver
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Message par case »

bonjour ;)

comme je savais pas quoi faire j'ai reflechis au probleme

et voici mon code qui peux surement etre optimisé mais il fonctionne

Code : Tout sélectionner

OpenConsole()
Declare sort()
mode=3  ; mode 1 afffiche toute les occurences trouvées classees par mots
        ; mode 2 affiche toute les occurences dans l'ordres 
        ; mode 3 affiche toute le portions de texte ayant les mots de recherche dans l'ordre
        
Global Dim mot$(255)         ; mots a rechercher
Global Dim posi(255,255)     ; position ou les mots on ete trouve
Global Dim pos(255)          ; pour chaque mots combien de positions on ete trouvées
Global word,occ$


a$="les jouets , les petits aiment les beaux jouets"
PrintN (a$) 
Print ("entrez les mots a rechercher")
search$=Input()
; cherche le nombre de mots a chercher
st=1
Print( "mots a rechercher")
Repeat 
  fnd=FindString(search$," ",st)
  If fnd
    mot$(word)=Mid(search$,st,fnd-st)
    Print ("["+mot$(word)+"]")
    word=word+1
    st=fnd+1
  EndIf
Until fnd=0
mot$(word)=Mid(search$,st,Len(search$)-(st-1))
Print ("["+mot$(word)+"]")
; recherche les mots
For m=0 To word
  st=1 ; on met le depart de la recherche a 0 
  fnd=0
  p=0
  Repeat
     fnd=FindString(a$,mot$(m),st)
     If fnd
        p=p+1
        posi(m,p)=fnd
        st=fnd+1
     EndIf
  Until fnd=0
  pos(m)=p
Next
; affichage des resultats
PrintN("-------------------")
Select mode
Case 1 ; affiche les mots seuls
  For m=0 To word
    For ocur=1 To pos(m)
      PrintN(Mid(a$,posi(m,ocur),Len(mot$(m))))
    Next
  Next
Case 2 ; affiche les resultats dans l'ordre trouves
  ;-----------classe les positions par ordre croissant un peu long
  sort()
  ; affichage des resultats dans l'ordre
  For a=1 To Len(occ$) Step 2
    mt=Asc(Mid(occ$,a,1))-1
    oc=Asc(Mid(occ$,a+1,1))-1
    PrintN(Mid(a$,posi(mt,oc),Len(mot$(mt))))
  Next
Case 3 ; affiche les resultats par suite dans l'ordre
  
  ;-----------classe les positions par ordre croissant un peu long
  sort()
  For a= 1 To Len(occ$) Step 2
    occ2$=occ2$+Mid(occ$,a,1) ; cree une chaine contenant uniquement les mots dans l'ordre sans leur positions
  Next
  ; cree le masque de recherche
  For a=0 To word
    tofind$=tofind$+Chr(a+1)
  Next
  ;
  For a=1 To Len(occ2$)
    Print(Str(Asc(Mid(occ2$,a,1)))+",")
  Next
  PrintN("")
  For a=1 To Len(tofind$)
    Print(Str(Asc(Mid(tofind$,a,1)))+",")
  Next
  PrintN("")
  ;
  PrintN("------------------")
  st=1
  Repeat
  PrintN("")
    fnd=FindString(occ2$,tofind$,st)
    If fnd
      mt=Asc(Mid(occ$,(fnd*2)-1,1))-1
      oc=Asc(Mid(occ$,(fnd*2),1))-1
      mt2=Asc(Mid(occ$,((fnd+(Len(tofind$)-1))*2)-1,1))-1
      oc2=Asc(Mid(occ$,((fnd+(Len(tofind$)-1))*2),1))-1      
      debut=posi(mt,oc) 
      fin=posi(mt2,oc2)+Len(mot$(mt2))
      longueur=fin-debut
      PrintN(Mid(a$,debut,longueur))
      st=fnd+1
    EndIf
  Until fnd=0
EndSelect
Input()
End

Procedure sort()
For m=0 To word
   totalpos=totalpos+pos(m) ;totalise les occurence trouvées
  Next
  PrintN("nombre total de positions"+Str(totalpos))
occ$=""
lastpos=0 ; derniere position dans la chaine
  minpos=999999999
  Repeat
    minpos=999999999
    For m=0 To word
      For ocur=1 To pos(m)
        If posi(m,ocur)>lastpos ; la position de l'ocurence actuelle est plus lointaine que la derniere occurence placee dans la chaine
            If posi(m,ocur)<minpos ; l'ocurence est la plus petite trouvee pour l'instant ou c'est la premiere trouvée
              minpos=posi(m,ocur)               ; on la defini comme position la plus basse
              toadd$=Chr(m+1)+Chr(ocur+1)          ; on defini l'ajout a la chaine (+1 for non null characters)
            EndIf
        EndIf
      Next
    Next
    lastpos=minpos
    occ$=occ$+toadd$
  Until Len(occ$)=totalpos*2
EndProcedure
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Message par case »

ton code a un bug :)

Code : Tout sélectionner

A$ = "les"

S$ = "les enfants les chocolats les cochons d'inde les autres choses les machins les bleux"

i= 1

Repeat
  pos = FindString( S$, A$, i)
  If pos
    Debug Mid(S$, pos, Len(A$))
   i+pos
  Else
    Break
  EndIf
ForEver
comme tu peux le voir a l'execution le programme ne trouves pas tout les 'les'

il faut remplacer

Code : Tout sélectionner

   i+pos
par

Code : Tout sélectionner

 i=pos+1
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Exact :wink:
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Merci case je vais étudier ton code avec intêret.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Je ne pige pas vraiment son fonctionnement, et surtout, je n'arrive pas à l'adapter.

Si j'ai bien compris, le

Code : Tout sélectionner

fnd=FindString(search$," ",st) 
sert à rechercher le caractère de search jusqu'à un espace ?


Voilà mon code, un texte est automatiquement inscrit dans l'editor, ce texte contient 3 liens web dont 2 .zip et 1 .com

search ="http:"

Lorsque l'on clique sur GO, l'imputrequester demande ce qu'on cherche,
je veux que lorsqu'on tape .zip par exemple, qu'il affiche les 2 liens
http://..........zip (et pas le dernier .com)

Code : Tout sélectionner

Enumeration
#ARS
#Affiche
#BT_Gaz
#BT_Copy
#BT_Ferme
#BT_Clear
#BT_Min
#Font_Affiche
EndEnumeration

Declare sort() 
Global Dim mot$(255)         ; mots a rechercher
Global Dim posi(255,255)     ; position ou les mots on ete trouve
Global Dim pos(255)          ; pour chaque mots combien de positions on ete trouvées
Global word,occ$
a$=""

Procedure OpenWindow_ARS()
  If OpenWindow(#ARS, 142, 341, 525, 371, "Chercheur par Ar-S", #PB_Window_SystemMenu|#PB_Window_TitleBar)
    If CreateGadgetList(WindowID(#ARS))
      EditorGadget(#Affiche, 3, 40, 520, 310)
      SetGadgetText(#Affiche,"http://momodd/54152312/mohairbo.zip456sszsdhttp://unautrelien.com/unrepertoire/fichier.zipt22dzzzz24http://dernierlien.com")
      ButtonGadget(#BT_Copy, 3, 350, 519, 20, "Copy", #BS_FLAT)
      ButtonGadget(#BT_Gaz, 3, 5, 165, 30, "GO", #BS_FLAT)
      ButtonGadget(#BT_Ferme, 508, 1, 15, 15, "X", #BS_FLAT)
      ButtonGadget(#BT_Min, 492, 1, 15, 15, "-", #BS_FLAT)
      ButtonGadget(#BT_Clear, 170, 5, 165, 30, "Clear", #BS_FLAT)
      ; Gadget Fonts
      SetGadgetFont(#Affiche, LoadFont(#Font_Affiche, "Arial", 9, 0))
      ; Gadget Colors
      PureCOLOR_SetGadgetColor(#Affiche, $40FF00, $0)
      PureCOLOR_SetButtonColor(#BT_Copy, #PureCOLOR_SystemColor, $2CD1EF)
      PureCOLOR_SetButtonColor(#BT_Gaz, #PureCOLOR_SystemColor, $A9FCF5)
      PureCOLOR_SetButtonColor(#BT_Ferme, #PureCOLOR_SystemColor, $A9FCF5)
      PureCOLOR_SetButtonColor(#BT_Min, #PureCOLOR_SystemColor, $A9FCF5)
      PureCOLOR_SetButtonColor(#BT_Clear, #PureCOLOR_SystemColor, $A9FCF5)
      ; Window Backcolor
      PureCOLOR_SetWindowColor(#ARS, $B9FAFD)
    EndIf
  EndIf
EndProcedure

Procedure sort()
For m=0 To word
   totalpos=totalpos+pos(m) ;totalise les occurence trouvées
  Next
;  SetGadgetText(#Affiche,Str(totalpos)+Chr(10))
occ$=""
lastpos=0 ; derniere position dans la chaine
  minpos=999999999
  Repeat
    minpos=999999999
    For m=0 To word
      For ocur=1 To pos(m)
        If posi(m,ocur)>lastpos ; la position de l'ocurence actuelle est plus lointaine que la derniere occurence placee dans la chaine
            If posi(m,ocur)<minpos ; l'ocurence est la plus petite trouvee pour l'instant ou c'est la premiere trouvée
              minpos=posi(m,ocur)               ; on la defini comme position la plus basse
              toadd$=Chr(m+1)+Chr(ocur+1)          ; on defini l'ajout a la chaine (+1 for non null characters)
            EndIf
        EndIf
      Next
    Next
    lastpos=minpos
    occ$=occ$+toadd$
  Until Len(occ$)=totalpos*2
EndProcedure 

OpenWindow_ARS()

;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Affiche
      ElseIf EventGadget = #BT_Copy
      ElseIf EventGadget = #BT_Gaz
      
  search$=InputRequester("Question","caractère à trouver","")
  st=0
  a$ = GetGadgetText(#Affiche)
  If a$
    Repeat
      fnd=FindString(a$," http",st)
       If fnd
          mot$(word)=Mid(a$,st,fnd-st)
          MessageRequester("01",mot$(word))
          word=word+1
          st=fnd+1
         Else
         MessageRequester("blop","ça chie")
       EndIf
    Until fnd=0
      mot$(word)=Mid(a$,st,Len(a$)-(st-1))
      MessageRequester("02",mot$(word))
      ; recherche les mots
      For m=0 To word
        st=1 ; on met le depart de la recherche a 0
        fnd=0
        p=0
      Repeat
          fnd=FindString(a$,mot$(m),st)
        If fnd
          p=p+1
          posi(m,p)=fnd
          st=fnd+1
        EndIf
      Until fnd=0
          pos(m)=p
     Next
        sort()
      For a= 1 To Len(occ$) Step 2
      occ2$=occ2$+Mid(occ$,a,1) ; cree une chaine contenant uniquement les mots dans l'ordre sans leur positions
      Next
      ; cree le masque de recherche
      For a=0 To word
      tofind$=tofind$+Chr(a+1)
      Next
      st=0
  ; End
      
 Else
    MessageRequester("Information", "Vide.", 0)
 EndIf 

      ElseIf EventGadget = #BT_Ferme
      End
      ElseIf EventGadget = #BT_Min
      ElseIf EventGadget = #BT_Clear
      SetGadgetText(#Affiche," ")
      EndIf
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #ARS
        CloseWindow(#ARS)
        Break
      EndIf
  EndSelect
ForEver
End
;
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Ah mais voilà qui vient de me faire plaisir, j'ai relu la doc de la droopylibs, et oh merveille..... la fonction between

Choubidou ! :P
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Message par case »

Si j'ai bien compris, le
Code:
fnd=FindString(search$," ",st)
sert à rechercher le caractère de search jusqu'à un espace ?
non ce code recherche un espace dans la chaine de caractere search$
et renvoi sa position dans fnd

dans mon exemple ca sert a trouver chacun des mots que l'on veux isoler
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Ok merci case.
Répondre