Tri de tableau (suite)

Résolu
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 25 sept. 2006 à 13:03
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 25 sept. 2006 à 17:22
 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

cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 26
25 sept. 2006 à 16:08
 Bonjour,

Merci "medelidrissi", je vais translater et tester ,
avant de valider "Réponse acceptée!".
jean-marc
3
medelidrissi Messages postés 180 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 26 novembre 2007 2
25 sept. 2006 à 14:13
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.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 26
25 sept. 2006 à 17:22
 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
0