Trier des enregistrements dans un fichier txt

Résolu
Sympa74 Messages postés 85 Date d'inscription lundi 25 septembre 2006 Statut Membre Dernière intervention 18 décembre 2008 - 20 nov. 2006 à 19:06
leSaleGauSS Messages postés 148 Date d'inscription samedi 4 novembre 2006 Statut Membre Derniè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)


Philippe - Sympa 74 

8 réponses

TMONOD Messages postés 256 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 6 novembre 2009 1
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...

En espérant vous avoir un peu aidé !

Jcbé[^]
3
leSaleGauSS Messages postés 148 Date d'inscription samedi 4 novembre 2006 Statut Membre Dernière intervention 4 décembre 2008
21 nov. 2006 à 00:56
TMONOD tu devrais te lancer dans la poésie ... philosophique !!
J'attends votre réponse finale Sympa74

@++

Quand je suis là tout va mal  
3
leSaleGauSS Messages postés 148 Date d'inscription samedi 4 novembre 2006 Statut Membre Derniè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.



Quand je suis là tout va mal  
0
Sympa74 Messages postés 85 Date d'inscription lundi 25 septembre 2006 Statut Membre Dernière intervention 18 décembre 2008 1
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
 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
TMONOD Messages postés 256 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 6 novembre 2009 1
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 !

Jcbé[^]
0
Sympa74 Messages postés 85 Date d'inscription lundi 25 septembre 2006 Statut Membre Dernière intervention 18 décembre 2008 1
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.

Philippe - Sympa 74
 
0
Sympa74 Messages postés 85 Date d'inscription lundi 25 septembre 2006 Statut Membre Dernière intervention 18 décembre 2008 1
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

        For count = 0 To compteur - 1  'Tri
            For count2 = count + 1 To compteur - 1
                If Entry(count, 0) > Entry(count2, 0) Then
                    temp = Entry(count, 0)
                    temp1 = Entry(count, 1)
                    temp2 = Entry(count, 2)
                    Entry(count, 0) = Entry(count2, 0)
                    Entry(count, 1) = Entry(count2, 1)
                    Entry(count, 2) = Entry(count2, 2)
                    Entry(count2, 0) = temp
                    Entry(count2, 1) = temp1
                    Entry(count2, 2) = temp2

                End If
            Next
        Next

        ' 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.

Merci à tous de votre attention.

Philippe - Sympa 74
 
0
leSaleGauSS Messages postés 148 Date d'inscription samedi 4 novembre 2006 Statut Membre Dernière intervention 4 décembre 2008
21 nov. 2006 à 18:55
Bonsoir. Dès que je trouve quelquechose, je vous le dirai alors a plus tard.
 (en espèrant que personne ne trouve la solution entre temps...)

Quand je suis là tout va mal  
0
Rejoignez-nous