Sympa74
Messages postés85Date d'inscriptionlundi 25 septembre 2006StatutMembreDernière intervention18 décembre 2008
-
20 nov. 2006 à 19:06
leSaleGauSS
Messages postés148Date d'inscriptionsamedi 4 novembre 2006StatutMembreDernière intervention 4 décembre 2008
-
21 nov. 2006 à 18:55
Bonsoir à tous,
Merci à ce groupe qui m'a déjà bien aidé et permis d'avancer dans mon
projet. Je suis toujours débutant... même si avec votre aide j'ai
l'impression de m'améliorer de jour en jour.
Voici le problème du jour.
J'ai un fichier client qui est stocké dans un fichier de type txt avec des champs délimités.
voici à titre d'exemple, une ligne (donc un enregistrement) extraite du fichier txt.
TURMA-FR55LES¤Madame¤TURLUTUTU ¤Marie¤5 rue du Pont¤Résidence
Coquelicot¤Batiment B¤74100¤AMBILLY¤FRANCE
J'ai déjà réussi pas mal de manipulations avec ce fichier
(visualisation de la fiche client, modification de la dite fiche avec
ré-écriture de la fiche dans le fichier, visualisation, chargement du
fichier dans une liste datagridwiew, etc.)
Chaque nouvelle fiche est enregistrée en append donc à la fin du
fichier et je veux pouvoir réorganiser ce fichier et le classer par
ordre alphabétique.
Le champ NOM et PRENOM sont deux champs différents mais disons que pour
faire simple dans un premier temps, je vais faire le classement de ce
fichier alphabétique en tenant compte uniquement du champ NOM.
Mon problème est que... ben je ne sais pas du tout comment m'y prendre.
J'ai pensé charger le fichier dans un tableau mais je crois (?) que
l'on ne peut trier le tableau que sur une colonne (ou alors j'ai rien
compris).
je vous remercie par avance de vos pistes si possible documentées par
un exemple car j'ai beaucoup de mal avec les explications abstraites :-(
Inutile de vous dire que j'ai déjà passé plusieurs heures à essayer de
chercher sur le forum tout ce qui pouvait être dit sur le tri mais je n'ai rien vu de concret par rapport à ma demande... (ou alors j'ai besoin de
lunettes)
TMONOD
Messages postés256Date d'inscriptionmardi 25 novembre 2003StatutMembreDernière intervention 6 novembre 20091 20 nov. 2006 à 20:14
Bonjour,
En admettant que vous vouliez accéder à votre fichier de manière sequentielle (et en admettant que vous ne pouvez pas faire autrement qu'utiliser un fichier texte...)
Si le fichier texte est gros ou destiné à le devenir (plusieurs milliers d'enregistrements) Le plus simple est de créer un fichier d'index qui contient dans un premier champ l'ID de chaque enregistrement, et autant de champs que de critères de tri qui contiennent le rang de l'enregistrement.
Exemple
Fichier :
4578, Dupont, Marie
7898,Terieur, Alex
12547,Terieur,Alain
987, Bourdon, Joseph
Index
ID,RangNom,RangPrenom
4578,4,3
7898,2,2
12547,3,1
987,1,4
Bien sûr, le tri doit pouvoir être fait en mémoire (tableau, liste...) et à l'issue de ce tri mettre à jour l'index.
Ainsi, pas besoin de trier le fichier principal, il est possible d'y adjoindre d'autre "signifiants", ainsi un champ peut-il porter la notion d'actif ou supprimé, notion qu'il faut reprendre dans l'alogorithme de tri qui doit "sauter" les supprimés. On peut peu aussi considérer le rang 0 (zéro) comme indiquant que l'enregistrement est supprimé.
Quand vous souhaitez "compacter" le fichier en éliminant les suppression, il faut alors faire un véritable tri du fichier et une réécriture triée et débarrassée des enregistrements supprimés...
leSaleGauSS
Messages postés148Date d'inscriptionsamedi 4 novembre 2006StatutMembreDernière intervention 4 décembre 2008 20 nov. 2006 à 19:49
Bonsoir, je suis en VBScript, et j'ai travaillé sur un fichier à trier il n'y a pas longtemps. Je ne sais pas si ça marche sous vb2005 mais tu peu essayer le code suivant :
dim Entry(3,1)
var = ""
Entry(1,0) = "Patty"
Entry(1,1) = "tim"
Entry(2,0) = "Kurt"
Entry(2,1) = "wallace" ''Pour l'instant je charge les données dans un tableau à 2 dimensions (matrice) mais on pourrait éventuellement ouvrir un fichier txt.
' ce qui donne : Patty tim
' Kurt wallace
For Count = 1 To 3 'Tri
For Count2 = Count + 1 To 3
If Entry(Count,0) > Entry(Count2,0) Then
Temp = Entry(Count,0)
Temp1 = Entry(Count,1)
Entry(Count,0) = Entry(Count2,0)
Entry(count,1) = Entry(count2,1)
Entry(Count2,0) = Temp
Entry(Count2,1) =Temp1
End If
Next
Next
For Count = 1 To 3
var = var &vbCrLf& Entry(Count,0) & " " & Entry(Count,1)
Next
wscript.echo var
''qui va afficher : Kurt wallace
Patty tim
Voila j'espere que ce code va pouvoir t'aider.
Sympa74
Messages postés85Date d'inscriptionlundi 25 septembre 2006StatutMembreDernière intervention18 décembre 20081 20 nov. 2006 à 21:00
Merci à LeSaleGauSS et à TMONOD pour vos réponses et vos pistes. Je vais plancher la dessus...
A 1ère vue... VB2005 n'aime pas trop VBscript... parce que j'ai fait un essai vite fait et il a pas l'air d'aimer çà.. mais je suppose qu'il faut adapter. je vais donc travailler la dessus.
La solution proposée par TMONOD a l'air intéressante aussi. Je vais voir comment je peux adapter cela.
Puisque la question est soulevée... le fichier client en question est actuellement de l'ordre de 2500 enregistrements et il ne devrait pas dépasser le double, voire le triple... mais si cela arrive... je pense que j'aurai les moyens de me "payer" un vrai informaticien..; (hihihihi)
si parmi les lecteurs de ce formidable forum, il y a d'autres suggestions ou conseils, je suis preneur. Merci d'avance.
Philippe - Sympa 74
Vous n’avez pas trouvé la réponse que vous recherchez ?
TMONOD
Messages postés256Date d'inscriptionmardi 25 novembre 2003StatutMembreDernière intervention 6 novembre 20091 20 nov. 2006 à 23:19
Bonsoir,
En fait, le "coup du fichier indexé" est un vieux classique des cours de structures de données à la fac. Ca ne nous rajeunit pas ! .
Ca pourrait être drôle de faire fi de toute la quincaillerie algorithmique superfetatoire dont nous équipe (gratuitement ?) notre cher Bill et de construire une jolie classe complètement démodée qui implémenterait la gestion de données au format texte sur le trés noble Framework 2.0.
Ce serait comme faire tourner un mixeur avec une centrale nucléaire, ca mettrait un peu de poésie et d'inutilité dans ce monde d'éfficacité et de rendement !
tiens, je vais peut-être consacrer quelques heures à mettre en route un si noble projet !
Sympa74
Messages postés85Date d'inscriptionlundi 25 septembre 2006StatutMembreDernière intervention18 décembre 20081 21 nov. 2006 à 00:36
A notre ami LeSaleGauss...
j'ai bien avancé ce soir avec ta procédure. J'ai fait pas mal de modifs... et ca marche presque. Bon là je vais me coucher... car demain j'ai une grosse journée au bureau... mais je pense finaliser cela demain soir... après quoi, je ferai passer la réponse finale.
merci encore de m'avoir mis dans la direction.
Sympa74
Messages postés85Date d'inscriptionlundi 25 septembre 2006StatutMembreDernière intervention18 décembre 20081 21 nov. 2006 à 16:59
Bonjour,
Sur la base des conseils de LeSaleGauSS... j'ai réussi à faire en sorte que ma procédure fonctionne.
Même en tant que débutant... je sens bien que c'est pas du top top... j'ai envie de dire que c'est certainement du bricolage aux vues des pros de ce forum... mais pour un débutant d'une centaine d'heures de prog... cela a au moins le mérite de fonctionner.
Je rappelle les infos pour une meilleure compréhension.
J'ai un fichier txt avec champs délimités qui contient environ 2000 noms de clients (avec coordonnées, etc.)
Chaque création fait un ajout en fin de fichier.
Le but étant donc de pouvoir trier le fichier et faire en sorte que les enregistrements soient classés par ordre alpha (sur le champ nom)
Au départ, j'ouvre le fichier txt... je compte le nombre de lignes...
je mets en place un tableau dimensionné en fonction du nb d'enregistrements dans le fichier et j'y place les différents champs.
Lorsque cela est fait... je fais le tri que voici :
Sub essaitri()
' ce tableau va contenir, le champ nom (qui sera trié), le prénom et le n° d'emplacement dans le fichier initial
Dim Entry(compteur, 2) 'compteur = le nb de ligne dans le fichier txt
Dim I As Integer
For I = 0 To compteur - 1
Entry(I, 0) = Tabligne(I, 2) + Tabligne(I, 3)
Entry(I, 1) = Tabligne(I, 3)
Entry(I, 2) = I
Next
Dim count As Integer
Dim count2 As Integer
Dim temp As String
Dim temp1 As String
Dim temp2 As String
' une fois trié, on va ré-enregistrer l'ensemble du fichier d'après le tableau
Je n'ai pas mis ici l'intégralité des opérations préalables au tri et au réenregistrement dans le nouveau fichier car l'ensemble représente environ 180 lignes.
Comme je le disais en préambule, je suis persuadé qu'il y a moyen de faire plus court.
Je suis preneur... bien sûr... mais déjà très satisfait que cela fonctionne... car j'avais besoin de ce résultat au plus vite.