Tri de tableau (suite)

[Résolu]
Signaler
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
-
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
-
 Bonjour à tous....

Suite de mes précédents topics et des posts y résultant.

En mettant un fichier .txt dans un tableau , je trie toutes les lignes sur
une colonne (colonne 6, représentant le nom d'une imprimante).
Ma question:
Comment pourrai-je ajouté un tri sur la colonne 3 ?

Merci pour vos éventuelles suggestions (peu importe la version de VB).
Vous noterez que, pour une fois, mon script n'est pas trop brouillon !!!

jean-marc

'Exemple:
'Contenu de la ligne1: X3573|09/09/2006|21h39|BOURDPRH|STAROHS2-BOUR390H|IMSB.EDITION|PR05|1|
'Contenu de la ligne2: X3573|09/09/2006|21h39|BOURDPRH|STAROHS2-BOUR390H|IMSB.EDITION|PR03|1|
'Contenu de la ligne3: X3573|09/09/2006|21h39|BOURDPRJ|STAROHS2-BOUR390H|IMSB.EDITION|PR05|1|
'
'résultat espéré:
'
'Contenu de la ligne1: X3573|09/09/2006|21h39|BOURDPRH|STAROHS2-BOUR390H|IMSB.EDITION|PR03|1|
'Contenu de la ligne2: X3573|09/09/2006|21h39|BOURDPRJ|STAROHS2-BOUR390H|IMSB.EDITION|PR05|1|
'Contenu de la ligne3: X3573|09/09/2006|21h39|BOURDPRH|STAROHS2-BOUR390H|IMSB.EDITION|PR05|1|
'les lignes 2 et 3 ont à ma même imprimante, j'aimerai donc ajouté un tri sur le contenu de la colonne 4 

Dim cprovisoire, bpermute, strtmp, i, j
Do While Not Fic_Entree.AtEndOfStream
   strtmp = Split(Fic_Entree.ReadAll,vbCrLf)   'création tableau du fichier
Loop
Fic_Entree.Close

bpermute = True
Do While bpermute = True      'Il faut au moins parcourir une fois                
   bpermute = False           'On tourne tant que l'on bouge des valeurs
   For i = UBound(strtmp) To 1 Step -1
   'MsgBox strtmp(i)
       If Len(strtmp(i)) > 1 Then
          For j = 0 To i - 1
              If Len(strtmp(j)) > 1 Then
                 If Split(strtmp(j), "|")(6) < Split(strtmp(j + 1), "|")(6) Then
                    cprovisoire = strtmp(j)        'On inverse les deux chaines
                    strtmp(j) = strtmp(j + 1)      'bis
                    strtmp(j + 1) = cprovisoire    'bis
                    bpermute = True
                 End If
              End If
          Next
       End If
   Next 
Loop



Dim liste
For i = 0 To UBound(strtmp)
    If Len(strtmp(i)) > 1 Then
       liste = strtmp(i) &vbCrLf& liste
    End If
Next
Fic_Sortie.WriteLine liste
Fic_Sortie.Close

3 réponses

Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
 Bonjour,

Merci "medelidrissi", je vais translater et tester ,
avant de valider "Réponse acceptée!".
jean-marc
Messages postés
180
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
26 novembre 2007
2
Bonjour,


Voici une petite solution parmis d'autres :



  Dim

fileReader
As


String
=   
My
.Computer.FileSystem.ReadAllText(
"C:\test.txt"
)<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>








       

Dim
TabLigne()
As


String








       

Dim
strTemp
As


String







 








       

Dim
i, j
As


Short







 








        fileReader = Replace(fileReader, vbCrLf & vbCrLf, vbCrLf)  
'on supprime les lignes vides pour faciliter le traitment








       

If
(Microsoft.VisualBasic.Right(fileReader, 2) = vbCrLf)
Then








            fileReader = Microsoft.VisualBasic.Left(fileReader, Len(fileReader) - 2)








       


End



If







 








        TabLigne = Split(fileReader, vbCrLf)  
'création d'un tableau de ligne du fichier







 








       


'tri par nom d'imprimante







       

For
i = 0
To
UBound(TabLigne) - 1








           

For
j = i + 1
To
UBound(TabLigne)








               


If

Split(TabLigne(i),
"|"
)(6) > Split(TabLigne(j),
"|"
)(6)
Then


'Tri croissant








                    strTemp = TabLigne(j)              
'On inverse les deux chaines








                    TabLigne(j) = TabLigne(i)








                    TabLigne(i) = strTemp








               

End


If








           

Next








       

Next







 








       

'tri par les elements de la colonne 3 de chaque imprimante








       


For

i = 0
To
UBound(TabLigne) - 1








           

For
j = i + 1
To
UBound(TabLigne)








               


If

UCase(Split(TabLigne(i),
"|"
)(6)) = UCase(Split(TabLigne(j),
"|"
)(6))
Then


' On verifie qu'on est tjr dans la meme imprimate








                   

If
Split(TabLigne(i),
"|"
)(3) > Split(TabLigne(j),
"|"
)(3)
Then


'Tri croissant








                        strTemp = TabLigne(j)              
'On inverse les deux chaines








                        TabLigne(j) = TabLigne(i)








                        TabLigne(i) = strTemp








                   

End


If








               

Else








                   

Exit


For

 

'ce n'est pas la peine de continuer car j va parcourir une autre imprimate que celle du i








               

End


If








           

Next








       

Next





Note que j'ai testé ce code sous Vb 2005 mais tu peux le traduire facilement en vbscript, en cas de besoin d'aide n'hésite pas à demander.


Bonne programmation.


Cordialement medelidrissi


<hr />

En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
 Re,

Ok pour le tri par (6) puis (3).
J'essaie en vain (pour l'instant) de supprimer les vbCrLf.
J'utilise le "If Len(strtmp(j)) > 1 Then... " qui n'est pas très esthétique.

Encore merci.
jean-marc