Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Chargement d'un très gros fichier. | |
| | Auteur | Message |
---|
pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Chargement d'un très gros fichier. Lun 21 Jan 2013 - 14:04 | |
| Bonjour à tous.
Je vous livre une astuce que vous pouvez éventuellement utiliser pour rechercher un item dans un fichier volumineux.
Le code suivant m'a été donné par Klaus.
Le fichier doit d'abord être trié avant utilisation, mais seulement grâce au code suivant.
Ensuite, il vous est possible de rechercher un élément quelconque, grâce à la méthode 'SearchStringList'.
Cette recherche est très rapide.
Le chargement du fichier étant lui-même très rapide (2 sec pour un fichier de 173.000 éléments, au lieu de 21 sec avec un objet List). - Code:
-
label chercher Dim res%, index% Dim a$, b$, mot$, separateur$, parenthese_gauche$, parenthese_droite$ separateur$=chr$(61)
mot$="Katze(féminin) (f)"
parenthese_gauche$=chr$(40) parenthese_droite$=chr$(41)
width 0,700
edit 2 : top 2,200 : width 2,200 button 3 : top 3,250 caption 3,"Chercher" : on_click 3,chercher
dll_on "kgf.dll"
print "Chargement du dictionnaire en cours..."
dlist 999 sort_on 999 a$ = "dico_français_allemand.txt" file_load 999,a$ ' Enregistrement du dico trié. file_save 999,a$
res% = dll_call1("CreateStringList",1) res% = dll_call2("LoadStringList",1,adr(a$)) message "Dictionnaire: "+str$(res%)+" lignes"
end
chercher: a$ = trim$(mot$)+" "+separateur$ b$ = string$(255," ") index% = dll_call3("SearchStringList",1,adr(a$),adr(b$)) b$ = trim$(b$) message str$(index%)+": "+b$ return
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Chargement d'un très gros fichier. Lun 21 Jan 2013 - 14:40 | |
| Petit complément d'information: La fonction CreateStringList a été modifiée dans la version actuellement en ligne sur MyDrive ! Son appel est maintenant: - Code:
-
res% = dll_call2("CreateStringList",Numero%,Mode%) Numero% donne le numéro de ls StringList b(entre 1 et 20) Mode% détermine si la liste est triée ou non. La valeur 1 indique que la liste est toujours triée, et toute autre valeur indique que la liste n'est pas triée. Si l'on a créé la liste avec Mode%=1, la fonction LoadStringList trie automatiquement la liste après le chargement. Dans ce cas, il n'est plus nécessaire le trier la liste au préalable. Mais: puisque le programme "sait" maintenant si la liste est triée ou pas, la fonction SearchStringList utilise la méthode de recherche ultra-rapide si la liste est triée, et une méthode plus lente si la liste n'est pas triée. Je reprends donc le code de Pan59 pour le rendre conforme à la version actuelle de KGF.dll: - Code:
-
label chercher Dim res%, index% Dim a$, b$, mot$, separateur$, parenthese_gauche$, parenthese_droite$ separateur$=chr$(61)
mot$="Katze(féminin) (f)"
parenthese_gauche$=chr$(40) parenthese_droite$=chr$(41)
width 0,700
edit 2 : top 2,200 : width 2,200 button 3 : top 3,250 caption 3,"Chercher" : on_click 3,chercher
dll_on "kgf.dll"
print "Chargement du dictionnaire en cours..."
' les lignes suivantes sont maintenant inutiles: ' dlist 999 ' sort_on 999 ' a$ = "dico_français_allemand.txt" ' file_load 999,a$ ' ' Enregistrement du dico trié. ' file_save 999,a$ ' fin des lignes inutiles
res% = dll_call2("CreateStringList",1,1) : ' passé à 2 paramètres avec l'option "liste triée" res% = dll_call2("LoadStringList",1,adr(a$)) message "Dictionnaire: "+str$(res%)+" lignes"
end
chercher: a$ = trim$(mot$)+" "+separateur$ b$ = string$(255," ") index% = dll_call3("SearchStringList",1,adr(a$),adr(b$)) b$ = trim$(b$) message str$(index%)+": "+b$ return
C'est vrai: la performance dans la recherche est bluffante. | |
| | | pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Chargement d'un très gros fichier. Lun 21 Jan 2013 - 14:43 | |
| Bonjour.
Oui, autant pour moi, il manquait le 3è paramètre à la fonction.
Pour la recherche d'un élément, j'utilise la sub suivante, à adapter suivant vos besoins: - Code:
-
sub chercher(element$, numero_objet_liste%)
' Recherche un élément dans un objet de type LIST. ' On passe une chaîne de caractères en paramètre qui représente le début de l'élément recherché. ' On peut chercher également l'élément exact. ' La recherche est insensible à la casse. ' L'objet LIST ciblé peut être un objet Panoramic, dans n'importe quelle fenêtre, ou alors un objet LIST d'une application externe, Panoramic ou non.
' 0 = la recherche aboutit si le début d'un élément correspond au critère ' 1 = la recherche aboutit si l'élément en sa totalité corrrespond au critère ' res% fournit 0 si l'élément n'est pas trouvé.
if instr(sens_traduction_texte$,"allemand")>0 and numero_objet_liste%=999 temporaire$ = string$(255," ") res% = dll_call3("SearchStringList",1,adr(element$),adr(temporaire$))
' temporaire$=trim$(left$(trim$(temporaire$),instr(trim$(temporaire$),separateur$))) if left$(temporaire$,len(element$))<>element$ then res%=0
else
hnd% = handle(numero_objet_liste%) res% = dll_call3("SearchListBox",hnd%,0,adr(element$)) end_if
end_sub | |
| | | Contenu sponsorisé
| Sujet: Re: Chargement d'un très gros fichier. | |
| |
| | | | Chargement d'un très gros fichier. | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |