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 |
|
|
| trier un fichier de façon rapide | |
| | Auteur | Message |
---|
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: trier un fichier de façon rapide Lun 23 Nov 2009 - 17:54 | |
| Salut à tous, je vous livre un morceau de code (pas pour le faire tourner vu que c'est un morceau). il s'agit d'extraire d'un DLIST 90 une ligne entiere B$ et de transfèrer dans DLISt 91 cette ligne pourvu que C$=A$:n90 est le COUNT(90) Le fichier contient tout les codes postaux de france sur 4 éléments séparé par le ";".il doit faire au moins 30000 lignes. Ce code fonctione (on peut affecter à A$ de 1à 5 chiffres qui représentes le code postal à rechercher), ce qui ne va pas c'est la longueur d'excution. Ma question c'est pensez-vous que c'est la méthode de recherche qui est en cause ou la taille du fichier - Code:
-
ajsit15: if numeric(a$)=0 then message "Vous devez entrer une valeur numérique":text nf%+23,"":return la=len(a$) for n=1 to n90 b$=item_read$(90,n) for a=1 to len(b$):c$=mid$(b$,a,1) if c$=";" then d$=mid$(b$,a+1,la):goto ajsit16 next a ajsit16: if a$=d$ then item_add 91,b$ next n
return
stop
Je résume la démarche: je fais rechercher dans B$, le ";" ensuite je lui dit d'affecter a D$ le même nombre de caractère que A$, a partir du caractère de B$ situé immédiatement après le ";" .Ensuite je compare A$ (code à rechercher) avec D$ et si c'est OK de l'insérer dans un autre DLIST (91) pour gestion ultérieur. Il faut bien 2mn pour les boucles soit bouclées. Y aurait-il une autre méthode plus rapide. Merci et à plus
Dernière édition par Jean Claude le Mar 24 Nov 2009 - 14:23, édité 1 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: trier un fichier de façon rapide Lun 23 Nov 2009 - 18:53 | |
| Peut-être les deux boucles imbriquées ? mais c'est bizarre quand même.
Juste une petite remarque : dans ta boucle for a = 1 ... tu devrais remplacer le goto ajsit16 par un exit_for et supprimer cette étiquette, ta sortie sauvage de boucle cause peut-être une saturation de pile. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: trier un fichier de façon rapide Lun 23 Nov 2009 - 19:04 | |
| Je vient d'essayer avec EXIT_FOR, çà reste vraiment trop long. Je vais essayer sans avoir 2 boucles imbriquées. Merci A+ | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: re Lun 23 Nov 2009 - 19:13 | |
| salut
Si tu fais une comparaison de code postal essaye le STEP 6 pour une comparaison par paquet. Si j'ai bien compris ton explication, ça devrait améliorer l'exécution de la boucle
@+ | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: trier un fichier de façon rapide Lun 23 Nov 2009 - 19:59 | |
| Georges, Je ne peut pas utiliser STEP, car le fichié de l'INSEE, que jai trouvé sur le net, se présente comme suit: - Code:
-
L'ABERGEMENT CLEMENCIAT;01400;AIN;1001 L'ABERGEMENT DE VAREY;01640;AIN;1002 AMAREINS;01090;AIN;1003 AMBERIEU EN BUGEY;01500;AIN;1004 AMBERIEUX EN DOMBES;01330;AIN;1005 AMBLEON;01300;AIN;1006 AMBRONAY;01500;AIN;1007 AMBUTRIX;01500;AIN;1008 ANDERT ET CONDON;01300;AIN;1009 ANGLEFORT;01350;AIN;1010 APREMONT;01100;AIN;1011
ET là, tu en as qu'un seul bout. Je suis donc obligé de lire la 2 ème variable qui est le code postal, pour extraire la ligne entière. Mais demain je vais expérimenter une autre façon de faire, pour avoir la rapidité de traitement que je veus. (justement là le STEP servira) Je te remercie et à plus.
PS: à propos, ton avatar actuel est sympa. | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: re Lun 23 Nov 2009 - 20:14 | |
| salut
oui, oui moi aussi il vient de la bibliothèque
@+ | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: re Lun 23 Nov 2009 - 20:37 | |
| resalut
Apparemment chaque ligne se termine par paquet de quatre chiffres. En dimensionnant chaque ligne avec LEN(), tu enlève d'office cinq caractères. Avec le step -1 tu recherche le ";" et voila tu peut avoir tout de suite toute ta ligne décomposée en quatres paquets. Je pense que ça pourrait vraiment améliorer la rapidité d'exécution de ta recherche.
@+ | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: trier un fichier de façon rapide Mar 24 Nov 2009 - 10:09 | |
| Oui mais,
Le 4 ème et dernier élément ne comporte pas forcémént 4 caractères, pour les départements à partir de 10, il t en a 5.
DE TOUTE FACONS, NE CHERCHE PLUS, J'AI UNE SOLUTION QUI DIVISE LA RECHERCHE CONSIDERABLEMENT.
Je vous prépare un message pour explications, car je ne peut pas déçament garder ma trouvaille pour moi.
Donc, à bientot
Je bosse pour vous | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: trier un fichier de façon rapide Mar 24 Nov 2009 - 14:50 | |
| Bon voilà la solution ' avant tout vous devez créer 1 fichiers vides dans PANORAMIC avec FILE_OPEN_WRITE ' voici le nom "codpost2.txt".Placé le dans un dossier "tri rapide" sur le bureau ' vous allez checher le fichier de base ici: http://www.galichon.com/codesgeo/' vous le décompréssez ' c'est un fichier EXEL, donc il faut passer par EXEL ' les éléments sont groupés dans la colone A de EXEL,virez la ligne 1 du tableau ' élargissez la colonne A (si vous voulez) ' maintenant vous enregistrez le classeur comme suit ' séléctionnez enrgistrer sous.., rechercher le dossier "tri rapide", ouvrez-le ' changez le nom du fichier insee par "codpost" et très important vous devez ' changer le type de fichier par texte(séparateur:tabulation)(*.txt)' cliquez sur enregitrer et répondez oui à la question suivante et ensuite non ' si tout va bien, vous devez retrouver dans le dossier "tri rapide" votre ' fichier codpost, qui pour PANORAMIC s'appelle "codpost.txt" ' ' Maintenant vous lancez ce code (je vous conseille de l'enregistrer, avant) ' Attention: le traitemment est assez long (2 à 4 mn) ' Voila vous avez un nouveau fichier "codpost2.txt" (Pour utilisation PANORAMIC) ' ou tout les éléments se retrouvent seul sur une ligne, dans l'odre de lectureje voulais dire: ou Chaque élément se retrouve seul sur sa ligne, dans l'odre de lecture - Code:
-
' Ce code sert à préparer "codpost2.txt" ' Attention exécution très longue 3 à 4 mn
dim a$,b$,c$,c2$,d$,f$,e1$,e2$,e3$,e4$ dim a,b,c,d,n,la,lb,n90 label t13,t15,t16
top 0,10:height 0,900:width 0,1000 list 90:width 90,400:height 90,800 list 91:left 91,500:width 91,400:height 91,800 gosub t13 end ' ______________________________________________________________________________ t13: file_add 90,"codpost.txt":n90=count(90)
a$="014": ' ne sert que si on utilise la condition if a$=d$ then (ne pas supprimer)
t15: la=len(a$) for n=1 to n90 b$=item_read$(90,n) for a=1 to len(b$):c$=mid$(b$,a,1) if c$=";" then d$=mid$(b$,a+1,la):c=len(b$)-(a):f$=mid$(b$,a+7,c):gosub t16:exit_for next a rem if a$=d$ then item_add 91,b$ item_add 91,e1$ item_add 91,e2$ item_add 91,e3$ item_add 91,e4$ next n
file_save 91,"codpost2.txt" return
t16: lb=len(b$)-(c+1):e1$=mid$(b$,1,lb):e2$=mid$(b$,a+1,5) for b=1 to len(f$):c2$=mid$(f$,b,1) if c2$=";" then e3$=left$(f$,b-1):d=len(f$)-b:e4$=mid$(f$,b+1,d) next b return
end
Là vous allez me dire c'est bien beau tout çà. j'ai repris mon code qui pêchait par sa lenteur (celui d'hier), je l'ai modifier pour s'adapter au nouveau fichier, comme suit: - Code:
-
' Attention temps d'exécution environ 30"
dim a$,b$,c$,c2$,d$,r$,f$,e1$,e2$,e3$,e4$ dim a,b,c,d,n,la,lb,n90
top 0,10:height 0,900:width 0,1000 list 90:width 90,400:height 90,800 list 91:left 91,500:width 91,400:height 91,800
file_add 90,"codpost2.txt":n90=count(90)
caption 0,n90
a$="833": ' Vous fabriquez le programme qui gere A$, essayez avec vos chiffres
la=len(a$) for n=2 to n90 step 4 r$=item_read$(90,n) b$=item_read$(90,n-1) if left$(r$,la)=a$ then item_add 91,b$:item_add 91,r$:item_add 91,"" next n
end
' Cette fois-ci 91 contient ce qui est recherché par A$ et beaucoup plus vite
La conclusion c'est que PANORAMIC préfère des fichiers multi-lignes, pourvu qu"il y ai un seul élément par ligne. Avez -vous regardé le CAPTION de FORM 0. Impressionnant.A+ | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: trier un fichier de façon rapide Mar 24 Nov 2009 - 18:54 | |
| Après chronomètrage, il faut 10 secondes pour récuperer le villes et code postaux du fichier "codpost2.txt" (suivant ce qu'on met dans a$). Sachant que ce fichier contient 155796 éléments.
Qui dit mieux ? | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: re Mar 24 Nov 2009 - 19:10 | |
| salut Jean-Claude
Tu me pardonneras, mais je n'ai toujours compris ce que tu voulais faire. Récupérer ligne par ligne, parquets par parquets dans chaque ligne. Pour moi, si tu pouvais me dire ton objectif, ce serait super. @+ | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: trier un fichier de façon rapide Mar 24 Nov 2009 - 19:57 | |
| Je voulais démontrer que si tu dois faire faire à ton programme des fichiers énormes, il vaut mieux, pour la rapidité d'execution, faite des fichiers comme ceci: - Code:
-
ORLEANS 45000 LOIRET 45000
Plutot que ceci: - Code:
-
ORLEANS;45000;LOIRET;45000
Je te garantie que çà fait une sacrée différence en temps d'exécution (pour PANORAMIC, bien sur) Mais as-tu fait l'essai ? | |
| | | Georges
Nombre de messages : 290 Age : 55 Localisation : Martinique Date d'inscription : 29/05/2009
| Sujet: re Mar 24 Nov 2009 - 20:03 | |
| salut Jean-Claude Oui, j'ai fait l'essai et j'ai obtenu exactement ce que tu expliques. Maintenant que tu l'as expliqué, j'ai compris la finalité. @+ | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: trier un fichier de façon rapide Mar 24 Nov 2009 - 20:24 | |
| çà me semble important que l'utilisateur de ton programme ne soit pas obligé d'aller fumer un joint pendant que le programme recherche un code postal.
Ce que je pense important, pour vous tous, c'est que cette façon, de créer et gérer un fichier, est rapide, surtout si vous préparez un monstre de programme.
Mais j'attend l'avis des experts, car ils ont peut-être mieux.
J'aimerai savoir ce qu'en pense Jack. Dans le projet que je développe, actuellement, la rapidité d'exécution est vital.
A+ | |
| | | Contenu sponsorisé
| Sujet: Re: trier un fichier de façon rapide | |
| |
| | | | trier un fichier de façon rapide | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |