Tri d'un fichier txt

leomalglaive Messages postés 1 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 5 décembre 2008 - 5 déc. 2008 à 10:50
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 - 5 déc. 2008 à 17:56
Bonjour,

je suis newbie en vbs, j'ai donc demandé à un ami de m'aider à faire un p'tit script vbs pour un tri de fichier. Son tri est parfait pour les petits fichiers, mais j'ai testé avec avec un fichier de 12Mo (soit 150000 lignes) et là au bout de 15mn, toujours rien.

Pouvez-vous m'aider à optimiser ce code?  Merci

Dim nNbLignes 'variable qui servira à stocke le nombre de lignes
Dim sLigneLue ' variable qui contiendra la ligne lue du fichier
Dim bFinBoucle 'booléen qui va nous servir uniquement pour le traitement de tri
Dim i ' pas besoin de le détaille celui-là
Dim z 'idem
Dim sChaineTampon 'chaine tampon servant uniquement pour la copie lors du tri

Set Fso = CreateObject("Scripting.FileSystemObject" ) 'déclaration d'un objet file system
Set Ftxt = Fso.OpenTextFile("result.txt", 1) 'on ouvre le fichier en lecture

nNbLignes = 0
Do While Not Ftxt.AtEndOfStream 'on parcourt le fichier une fois pour avoir son nombre de lignes
    nNbLignes = nNbLignes + 1
    'On va définir un tableau contenant nos lignes et leur date pour les trier
    ReDim Preserve Tableau(nNbLignes)
    sLigneLue = Ftxt.ReadLine
    Tableau(nNbLignes) = sLigneLue ' on stocke dans la deuxième colonne la ligne intégrale
Loop

'On ferme le fichier
Ftxt.Close
'On libère la mémoire
Set Ftxt = Nothing

'boucle de parcours du tableau pour tri
Do
    bFinBoucle = 0
    For i = 1 To nNbLignes - 1
        If left(Tableau(i),17) > left(Tableau(i+1),17) Then
           For z = i To nNbLignes - 1
                sChaineTampon = Tableau(z)
               Tableau(z) = Tableau(z+1)
               Tableau(z+1) = sChaineTampon
           Next
           bFinBoucle = 1
        End If
    Next
Loop While bFinBoucle = 1

'une fois notre tableau trié on écrit les lignes dans un nouveau fichier
Set FSys = CreateObject("Scripting.FileSystemObject")
Set Ftxt2 = FSys.CreateTextFile("c:\test\v3\result2.txt")
For i = 1 to nNblignes
        Ftxt2.WriteLine Tableau(i)
Next

'On ferme le fichiers
Ftxt2.Close
'On libère la mémoire
Set Ftxt2 = Nothing

2 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
5 déc. 2008 à 13:40
Bonjour,

Thèmes / [forum-VB-NET-VB-2005_40.aspx VB.NET et VB 2005]
alors que tu es en VBS ...

Je te conseillerais de récupérer le nombre de lignes avant de dimensionner ton tableau, car le ReDim est gourmand en ressource.

0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
5 déc. 2008 à 17:56
Bonjour leomalglaive


Pour ce qui est du ReDim, NHenry a raison : lors du chargement du fichier, ton tableau est redimensionné 150000 fois !

Et une fois que cette phase est finie, ton programme n'est pas au bout de ses peines, puisqu'il trie le tableau par la technique du Bubble Sort, le plus lent des algorithmes de tri.

Ton algo est, comme tu le dis, parfait pour les petits fichiers, mais complètement inutilisable pour l'usage que tu veux en faire.

Amicalement
0
Rejoignez-nous