Vbscript: tri par ordre alphabétique dans un fichier txt

Signaler
Messages postés
3
Date d'inscription
jeudi 28 avril 2011
Statut
Membre
Dernière intervention
29 avril 2011
-
Messages postés
540
Date d'inscription
mardi 4 août 2009
Statut
Membre
Dernière intervention
1 février 2013
-
Salut tous le monde !
voila j'essaye de faire un script VBS qui doit lire un fichier texte et crée un autre fichier texte avec les lignes qui se trouvent dans le premier en les classent par ordre alphabétique via la première valeur qui se trouve dans chaque ligne, exemple :
Premier fichier.txt avec les lignes en désordre :
reseau,ipesec,.....,....
cisco,chap1,....,.....

le script VBS va lire chaque ligne et il va les mettre par ordre alphabétique dans un autre, le résultat dans deuxième fichier.txt va etre:
cisco,chap1,....,.....
reseau,ipesec,.....,....
Mon code :
Option Explicit

Dim objFichier, MyFile,File
Const Lire = 1
'**************************
' Creation objet lire
Set objFichier=CreateObject("Scripting.FileSystemObject")

'************************** 
Set MyFile= objFichier.OpenTextFile("fichier.txt",Lire)

Set File= objFichier.OpenTextFile("fichier2.txt",8, True)

Dim ligne,i,a,x
DO WHILE NOT MyFile.AtEndOfStream 
Ligne = myfile.readline
a=Split(ligne,chr(44),4)
for each x in a
wscript.echo x
File.Write x & chr(44) 
next
LOOP 'fin lire
MyFile.Close
WScript.quit 0

J'ai réussi a récupérer les valeurs séparé par "," dans le premier fichiers grâce a split et les mettre dans le deuxième.
Mon premier problème c'est que je n'arrive pas a écrire les valeurs qui se trouvent dans x, ligne par ligne, 4 par 4 ils sont mit sur la même ligne.
Deuxième problème : comment faire le tri alphabétique a l'aide de la première valeur de chaque ligne ?
Note : je débute avec VBscript et la prog en générale :)
merci d'avance

5 réponses

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

Il suffit de :
- Mettre le fichier dans un tableau avec split de chaque ligne;
- Trier le tableau avec split sur chr(44) ;
- Ecrire le tableau trié dans un nouveau fichier.

Option Explicit
Const MyFile = "d:\Test.txt"
Const MySortedFile = "d:\Test_trié.txt"
 
Dim objFso, objTextFile
Dim arrLines 
Dim bpermute, cprovisoire, i, j 

Set objFso = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFso.OpenTextFile(MyFile, 1)
arrLines = Split(objTextFile.ReadAll,vbCrLf)
objTextFile.Close 

bpermute = True
Do While bpermute = True                     
   bpermute = False           
   For i = UBound(arrLines) To 1 Step -1 
       If Len(arrLines(i)) > 1 Then
          For j = 0 To i - 1 
              If Len(arrLines(j)) > 1 Then
                 If Split(arrLines(j), Chr(44))(0) > _
                    Split(arrLines(j + 1), Chr(44))(0) Then 
                    cprovisoire = arrLines(j)       
                    arrLines(j) = arrLines(j + 1)     
                    arrLines(j + 1) = cprovisoire    
                    bpermute = True 
                 End If
              End If 
          Next 
       End If 
   Next  
Loop
'Write File
Set objTextFile = objFso.CreateTextFile(MySortedFile, 2)
For i = 0 To UBound(arrLines) 
    objTextFile.WriteLine arrLines(i)
Next
objTextFile.Close
Set objTextFile = Nothing
Set objFso = Nothing





jean-marc
Messages postés
3
Date d'inscription
jeudi 28 avril 2011
Statut
Membre
Dernière intervention
29 avril 2011

Merci beaucoup pour ta reponse jean-marc !!
ça marche très bien :) je ne veux pas en abuser mais j'aimerai bien te poser quelques questions si c'est possible :)

La variable bpermute elle sert a quoi ?

Sinon dans
For i = UBound(arrLines) To 1 Step -1 

tu te déplace sur la ligne pour choisir la valeur que tu veux comparer c'est sa ? parce que j'ai pas très bien compris a quoi sert 1 Step -1 :(
Dernière question si je veux faire le tri par de numéro dans la troisième position que dois je faire ?

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

Dans ton cas, For i = UBound(arrLines) To 1 Step -1 est inutile.
Cela permet de lire un tableau par la fin.
A remplacer par For i = 0 To UBound(arrLines)


Pour le tri:
bpermute  = True                        'Il faut au moins parcourir une fois
Do While bpermute = True               'On tourne tant que l'on bouge des valeurs
    bpermute = False                   'Si on est ici c qu'il faut réinitialiser bpermute
    For t = 1 To imax - 1              'On tourne autant de fois qu'il y a de fiches
                                       '(-1 vu qu'on compare 2 valeurs) 
       If ligne(t) < ligne(t + 1) Then 'Si on a trouvé deux valeurs mal rangées 
                                       '(autrement dit une valeur qui se
                                       'trouve plus bas dans le tableau mais qui 
                                       'est plus levée...
          cprovisoire = ligne(t)       'On inverse les deux chaines
          ligne(t) = ligne(t + 1)      'bis
          ligne(t + 1) = cprovisoire   'bis
          bpermute = True
     End If
  Next
Loop



Pour trier sur la troisième position, il suffit de remplacer les (0) par (2)
Attention si zone numérique ou alphanumérique
Faire une recherche sur les snippets

Voir aussi le QuickSort de us_30
[url]http://www.codyx.org/snippet_tri-nombres_421.aspx/url

jean-marc
Messages postés
3
Date d'inscription
jeudi 28 avril 2011
Statut
Membre
Dernière intervention
29 avril 2011

C'est parfait !!
je vais modifier encore un peut le code pour bien comprendre le fonctionnement :)
merci encore jean-marc !!
bon week-end
Messages postés
540
Date d'inscription
mardi 4 août 2009
Statut
Membre
Dernière intervention
1 février 2013
1
@jean-marc:
Salut,
je viens de tester ton script et il marche parfaitement...et donc j'aimerais bien m'y mettre moi aussi VBS,alors aurais tu un tutoriel ou un document qui pourrait m'aider à me lancer aussi dans tout ça?
Merci d'avance!!

Ce qui compte,ce n'est pas ce qu'on a mais plutôt ce que l'on fait avec ce qu'on a...

Visual Basic .Net is the best
and vb6.0