FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Gestionnaire de Projets Panoramic
par Minibug Aujourd'hui à 2:10

» Mah-Jong européen new-look
par jjn4 Hier à 16:35

» Button_picture
par pascal10000 Hier à 11:41

» Pourquoi le compilateur stagne
par Minibug Hier à 11:09

» 4 (en analyse): SYNEDIT_TARGET_IS_OBJECT devient inactif
par Jack Hier à 10:09

» 3 (en analyse): Mauvaise interprétation du string "THEN"
par Jack Hier à 10:03

» KGF.dll - demandes ou suggestions de modifications ou ajouts
par Marc Hier à 10:00

» KGF_dll - nouvelles versions
par pascal10000 Mer 13 Déc 2017 - 17:27

» track_bar circulaire
par Klaus Mar 12 Déc 2017 - 13:54

» API Windows
par Klaus Mar 12 Déc 2017 - 3:21

» Cartes de voeux, menus, etc.
par JL35 Lun 11 Déc 2017 - 17:48

» a l'aide klaus
par Minibug Lun 11 Déc 2017 - 11:42

» bug SYNEDIT_TARGET_IS_OBJECT
par Jack Lun 11 Déc 2017 - 0:16

» Jukebox : Serge Reggiani
par papydall Sam 9 Déc 2017 - 5:58

» Ecouter la radio fm sur votre pc
par pascal10000 Sam 9 Déc 2017 - 3:42

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Décembre 2017
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
25262728293031
CalendrierCalendrier

Partagez | 
 

 Fonction SearchStringList.

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Pedro Alvarez

avatar

Nombre de messages : 882
Date d'inscription : 19/01/2014

MessageSujet: Fonction SearchStringList.   Jeu 21 Jan 2016 - 12:41

Bonjour.

@Klaus.


J'aurais besoin d'un paramètre supplémentaire à cette fonction, qui permettrait de rechercher un item, non pas à partir du début d'une liste, mais à partir d'un n° de ligne donné.

Et d'une nouvelle fonction qui permettrait de rechercher un item semblable, à partir du dernier item trouvé.

Mais je ne sais pas si tout cela est faisable facilement.

Merci de la suite.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonction SearchStringList.   Jeu 21 Jan 2016 - 14:59

Désolé, mais dans les deux cas, je ne peux te donner de solution toute faite. En effet, la recherche dans la liste s'effectuant, soit par la méthode "Find" de Delphi (et je n'y ai pas accès), soit par un algorithme de dichotomie, qui est difficile à adapter pour une recherche du type "suivant". Et la situation est encore pire pour une recherche d'un "semblable" - rien que la définition de ce terme n'est pas évident.

Je te suggère de faire des SUBs pour cela. Pour la recherche de l'occurrence suivante, tu n'as guère d'autre choix que de faire une lecture séquentielle jusqu'à tomber dessus, éventuellement avec un critère de fin. Et pour la recherche d'un "semblable", bon courage...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Invité
Invité



MessageSujet: Re: Fonction SearchStringList.   Jeu 21 Jan 2016 - 15:41

J'ai fait ces jours un p'tit programme qui n'était pas prévu d'être publié. Il s'agit pour moi de faire un cahier des charges, et j'ai préféré passer par un ordi, que d'avoir des feuilles qui se perdent.
J'y avait inclue un edit (en jaune pour mettre un mot à rechercher) et un bouton recherche pour la première recherche, et un second pour chercher les suivants. J'ai pas le temps de le reprendre pour n'avoir que ces fonctions, mais je ne pense pas qu'il soit compliqué pour ne se servir que des subs intéressées.
Code:
LABEL ajout_list , clic_list , sauver ,recherche , suite
dim dos$,list$ , memo$ , le
dos$ = "C:\PANO\"    :' à modifié
list$ = dos$+"cahier_DC_liste.txt"
memo$ = dos$+"cahier des charges.txt"
' .............
dim a$,a,t$,v , w , v1 , w1 , a1

font_size 0,10  : font_name 0,"Consolas" : full_space 0 :height 0,600: caption 0,"Cahier des charges MEMO_COULEURS"  : ' font_bold 0
COMBO  10: left 10,10 : top 10,10 : width 10,300 : on_click 10,clic_list : if file_exists(list$) = 1 then file_load 10,list$
BUTTON 12: left 12,320: width 12,150 : caption 12,"Ajouter List" : on_click 12,ajout_list
EDIT  14: left 14,480: top 14,10 : width 14,400
MEMO  20: left 20,10 : top 20,40 : width 20,width(0)-50: height 20,500 : bar_vertical 20 : if file_exists(memo$) = 1 then file_load 20,memo$
BUTTON 25: left 25,900: width 25,150 : caption 25,"Sauve MEMO"  : on_click 25,sauver
EDIT  30: left 30,1060:width 30,200 : color 30,240,240,47
BUTTON 35: left 35,1270:width 35,100 : caption 35,"Recherche" : on_click 35,recherche
BUTTON 40: left 40,1380:width 40,100 : caption 40,"Suite" : on_click 40,suite

set_focus 20 : color 20,213,245,220 : font_name 20,"Consolas" : font_bold 20
END
' =============================================================================
ajout_list:
  if text$(14) <> "" then item_add 10,text$(14) : file_save 10,list$ : item_add 20,"@_"+text$(14)+"_@"
return
' =============================================================================
clic_list:
  clic_list() : return
' ----------------------------------------------------
SUB clic_list()
  dim_local clic$,tx$,a,le, copi$ , v , a$
  clic$ = "@_"+item_index$(10)+"_@"
  if count(20) > 0
      for a = 1 to count(20)
        tx$ = item_read$(20,a)
        v = instr(tx$,clic$)
        if v > 0
            copi$ = tx$ : v = v + le
            a$ = item_read$(20,count(20))
            item_delete 20,count(20) : item_add 20,a$ : ' pour avoir la sélection finale en haut
            item_delete 20,a : item_insert 20,a,tx$
            select_text 20,v,len(clic$) : exit_for
        end_if  : le = le + len(tx$)+2
      next a  : set_focus 20
  end_if
end_sub
' =============================================================================
sauver:
  file_save 20,memo$ : set_focus 20
return
' =============================================================================
recherche:
  a = 0 : v=0 : w=0
  gosub suite
return
' ----
suite:
  t$ = upper$(text$(30)) : ' bouton 35 et suite: 40
  if count(20) > 0
      repeat
        if instr_pos(upper$(a$),t$,w+1) = 0 then a = a + 1
        if a = 0 then a = 1
        caption 0,"a="+str$(a)
        a$ = upper$(item_read$(20,a))
      until a = count(20) or instr(a$,t$) > 0
      a$ = item_read$(20,a)
      if a <= count(20)
        item_delete 20,a

        item_insert 20,a,a$
        copier()
      end_if
      set_focus 20
  end_if
  w = v
return
' =============

sub copier()
  dim_local b$ , i , copi$  : le = 0
  if count(20) > 0 and t$ <> ""
      v = w
      for i = 1 to a
        copi$ = item_read$(20,i) : b$ = upper$(copi$)
        if i = a
            if v = 0
              v = instr(b$,t$)
            else
              v = instr_pos(b$,t$, v+1)
            end_if
            le = le + v
            select_text 20,le,len(t$) : exit_for
        else
            le = le + len(b$)+2
        end_if
      next i
      if instr_pos(b$,t$,v+1) = 0 then v= 0 : w=0 : a=a+1
  end_if
end_sub

Ce qui est concerné pour correspondre au sujet est
recherche:
suite
sub copier()
Revenir en haut Aller en bas
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonction SearchStringList.   Jeu 21 Jan 2016 - 15:45

Une solution 100 % Panoramic. Utile !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Pedro Alvarez

avatar

Nombre de messages : 882
Date d'inscription : 19/01/2014

MessageSujet: Fonction SearchStringList.   Jeu 21 Jan 2016 - 17:58

Bonjour.

Merci Klaus d'avoir bien voulu étudier le problème.
J'avais cependant un doute quant à sa faisabilité.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonction SearchStringList.   Jeu 21 Jan 2016 - 18:43

Je suis tombé sur l'algorithme Damerau-Levenshtein, qui calcule la "distance" entre deux mots, en fonction de poids arbitraires affectés aux substitution, insertion et suppression de caractères. Les résultats sont intéressants, et je vais bientôt mettre en ligne une version qui permettra de comparer deux chaînes (mots) et de calculer leur degré de proximité.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonction SearchStringList.   Jeu 21 Jan 2016 - 20:34

Je viens de mettre une version en ligne qui gère cet algorithme. Tu peux maintenant parcourir ton dictionnaire en boucle, séquentiellement, et comparer chaque mot trouvé par rapport à un autre mot de référence, calculer la "proximité" entre les deux mots et retenir ceux dont la valeur de proximité est inférieure à un seuil que tu détermineras.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Pedro Alvarez

avatar

Nombre de messages : 882
Date d'inscription : 19/01/2014

MessageSujet: Fonction SearchStringList.   Jeu 21 Jan 2016 - 22:16

Bonsoir.

Un grand merci Klaus pour ces nouveautés, que je vais tester de suite.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonction SearchStringList.   Ven 22 Jan 2016 - 3:23

Regarde le petit bout de programme qui suit. Il cherche dans un de tes dictionnaires, toutes les lignes dont le début (jusqu'au premier ";") est "proche" d'un mot référence que tu saisis en haut. Tu peux régler de degré de ressemblance avec le spin pour le seuil. Le programme remplit une liste avec les adresses des enregistrements trouvés, et une autre liste avec une copie de ces enregistrements, en indiquant la valeur de ressemblance devant le texte de l'enregistrement. Il faudra adapter les chemins vers KGF.dll et le dictionnaire:
Code:
' indexer_dico_français_espagnol_txt.bas

label exec

dim res%, file$, i%, n%, s$, s1$, p%, mot$, seuil%
file$ = "dico_français_espagnol.txt"



dll_on "KGF.dll"

alpha 1 : top 1,10 : left 1,10 : caption 1,"Mot à chercher:"
edit 2 : top 2,10 : left 2,100
button 3 : top 3,10 : left 3,250 : caption 3,"Chercher" : on_click 3,exec
alpha 4 : top 4,10 : left 4,400 : caption 4,"Seuil:"
spin 5 : top 5,10 : left 5,450 : position 5,7 : width 5,70

res% = dll_call2("CreateStringList",1,0)
res% = dll_call2("LoadStringList",1,adr(file$))
n% = dll_call1("StringListItemCount",1)
list 10 : top 10,40 : left 10,10 : width 10,150 : height 10,350
list 11 : top 11,40 : left 11,180 : width 11,300 : height 11,350

end

exec:
  seuil% = position(5)
  s1$ = string$(255," ")
  mot$ = lower$(trim$(text$(2)))
  if mot$=""
    message "Rien à chercher"
    return
  end_if
  for i%=1 to n%
    res% = dll_call3("ReadStringList",1,i%,adr(s1$))
    s$ = lower$(left$(s1$,instr(s1$,";")-1))
    res% = dll_call2("Levenshtein",adr(mot$),adr(s$))
    if res%<seuil%
      item_add 10,str$(i%)
      item_add 11,str$(res%)+":  "+s1$
    end_if
  next i%
  return
C'est là qu'un voit toute la puissance de cette fonction ! Avec un prime le fait qu'une ligne trouvée n'a pas forcément besoin de commencer avec le mot recherché, pourvu que la "proximité" est inférieur au seuil indiqué.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Pedro Alvarez

avatar

Nombre de messages : 882
Date d'inscription : 19/01/2014

MessageSujet: Fonction SearchStringList.   Ven 22 Jan 2016 - 10:15

Bonjour.

Merci Klaus pour ce test.

Mais ce qui me fait peur, c'est la durée d'exécution de la boucle, au vu de la ligne:

for i%=1 to n%

qui doit lire l'ensemble du fichier !!

Je vais tenter ma chance avec les fichiers binaires, avec lesquels il est possible de rechercher une chaîne, à partir d'une certaine position.

A voir.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonction SearchStringList.   Ven 22 Jan 2016 - 13:51

Bien sûr que c'est long - on parcourt la totalité de la liste, et elle est grande. Mais ça a lieu en mémoire, sans accès disque supplémentaire. Je ne vois pas bien comment on pourrait limiter cela...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Fonction SearchStringList.   Ven 22 Jan 2016 - 14:15

J'ai fait une version légèrement modifiée du programme de recherche par "semblables". Je cherche d'abord le mot exact ce qui est rapide. Si ce mot n'est pas trouvé, on cherche dans la liste entière - pas le choix. Par contre, si le mot est trouvé, je limite (arbitrairement) la recherche à une section de 10 lignes auparavant et 50 lignes après, soit 60 lignes. Et le résultat est immédiat:
Code:
' indexer_dico_français_espagnol_txt.bas

label exec

dim res%, file$, i%, k%, n%, s$, s1$, p%, mot$, seuil%, deb%, fin%
file$ = "dico_français_espagnol.txt"



dll_on "KGF.dll"

alpha 1 : top 1,10 : left 1,10 : caption 1,"Mot à chercher:"
edit 2 : top 2,10 : left 2,100
button 3 : top 3,10 : left 3,250 : caption 3,"Chercher" : on_click 3,exec
alpha 4 : top 4,10 : left 4,400 : caption 4,"Seuil:"
spin 5 : top 5,10 : left 5,450 : position 5,7 : width 5,70

res% = dll_call2("CreateStringList",1,0)
res% = dll_call2("LoadStringList",1,adr(file$))
n% = dll_call1("StringListItemCount",1)
list 10 : top 10,40 : left 10,10 : width 10,150 : height 10,350
list 11 : top 11,40 : left 11,180 : width 11,300 : height 11,350

end

exec:
  seuil% = position(5)
  s1$ = string$(255," ")
  mot$ = lower$(trim$(text$(2)))
  if mot$=""
    message "Rien à chercher"
    return
  end_if
  res% = dll_call3("SearchStringList",1,adr(mot$),adr(s1$))
  if res%<1
    deb% = 1
    fin% = n%
  else
    deb% = res% - 10 : if deb%<1 then deb% = 1
    fin% = res% + 50 : if fin%>n% then fin% = n%
  end_if
  for i%=deb% to fin%
    res% = dll_call3("ReadStringList",1,i%,adr(s1$))
    s$ = lower$(left$(s1$,instr(s1$,";")-1))
    res% = dll_call2("Levenshtein",adr(mot$),adr(s$))
    if res%<seuil%
      item_add 10,str$(i%)
      item_add 11,str$(res%)+":  "+s1$
    end_if
  next i%
  return
Essaie avec éphémère, bague etc... C'est immédiat.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé




MessageSujet: Re: Fonction SearchStringList.   

Revenir en haut Aller en bas
 
Fonction SearchStringList.
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: A l'aide!-
Sauter vers: