Page 1 sur 1
[R] Trier un fichier txt
Posté : ven. 06 mars 2009 14:45
par marsujp
Bonjour,
J'ai un fichier .txt avec un horaire de la forme suivante :
Code : Tout sélectionner
a,bbb,15:10,cccccc
d,eeeeeeeeeeee,12:00,ffff
x,yyyyyy,19:20,zzzzzzzzzzzzzz
Ce que j'aimerais, c'est trier ce fichier .txt par horaire !
Je peux récupérer l'horaire de la ligne en cours, mais comment le trier par ligne ?
Faut il passer par un autre fichier ?
Merci.

Re: [...]Trier un fichier txt
Posté : ven. 06 mars 2009 18:55
par FernandG
Bonsoir,
Ci dessous un exemple de code pour répondre à votre demande. Je suis parti de votre exemple que j'ai alimenté de deux lignes supplémentaires pour le test de tri.
► Afficher le texte
Code : Tout sélectionner
a,bbb,15:10,cccccc
d,eeeeeeeeeeee,12:00,ffff
x,yyyyyy,19:20,zzzzzzzzzzzzzz
m,hhhhhhhhhh,01:59,ffffff,ggggg
r,pppppp,23:48,yyyy,ttttt,xxx
Je me sers surtout de la commande
StringRegExp et du regex
([01]\d|2[0123]):([0-5]\d) qui vérifie le format de l'heure et des minutes. Donc 12:61 et 24:01 ne fonctionne pas.
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
Local $array[1][2]
Dim $i, $temps, $ligne, $fichier, $fichier_trier
$fichier = FileOpen(@DeskTopDir & "\Test.txt", 0)
If $fichier = -1 Then
MsgBox(16, "Erreur", "Impossible d'ouvrir le fichier txt.")
Exit
EndIf
$i = 0
While 1
$ligne = FileReadLine($fichier)
If @error = -1 Then ExitLoop
If $i >= 1 Then ReDim $array[$i+1][2]
$temps = StringRegExp($ligne, "([01]\d|2[0123]):([0-5]\d)", 2)
If @error = 0 Then
$array[$i][0] = StringReplace($temps[0], ":", "")
$array[$i][1] = $ligne
Else
$array[$i][0] = ""
$array[$i][1] = $ligne
EndIf
$i += 1
Wend
FileClose($fichier)
_ArraySort($array)
;_ArrayDisplay($array, "Tri du fichier")
$fichier_trier = FileOpen(@DeskTopDir & "\Test_Trier.txt", 10)
If $fichier_trier = -1 Then
MsgBox(16, "Erreur", "Impossible d'ouvrir le fichier txt.")
Exit
EndIf
For $i = 0 To UBound($array, 1) - 1
FileWrite($fichier_trier, $array[$i][1] & @CRLF)
Next
FileClose($fichier_trier)
Exit
Qu'en est-il si l'horraire n'est pas correct et/ou une ligne ne comportant pas d'horraire ???
Dans le code, ce cas sera néanmoins pris en compte et mis en début de fichier. Il est facile de modifier cet état pour le mettre en fin de fichier par exemple. Et si tu ne veux pas de ces lignes, il suffit de supprimer du code les lignes:
Voilà.
Tiens nous au courant.
Bonne soirée.
AutoITement.
Re: [...]Trier un fichier txt
Posté : ven. 06 mars 2009 21:30
par FernandG
Bonsoir,
Je m'auto corrige en tenant compte de la remarque de Tlem sur la fonction
ReDim dans ce
post. Le principe du code est quasi le même. Voici par conséquent un nouveau code répondant au post d'origine.
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
Dim $i, $temps, $ligne, $fichier, $fichier_trier, $Sort, $aSort, $NewLigne
$fichier = FileOpen(@DeskTopDir & "\Fichier.txt", 0)
If $fichier = -1 Then
MsgBox(16, "Erreur", "Impossible d'ouvrir le fichier txt.")
Exit
EndIf
While 1
$ligne = FileReadLine($fichier)
If @error = -1 Then ExitLoop
$temps = StringRegExp($ligne, "([01]\d|2[0123]):([0-5]\d)", 2)
If @error = 0 Then
$Sort &= StringReplace($temps[0], ":", "") & "#" & $ligne & @CR
Else
$Sort &= "#" & $ligne & @CR
EndIf
Wend
FileClose($fichier)
$Sort = StringLeft($Sort, StringLen($Sort) - 1)
$aSort = StringSplit($Sort, @CR)
_ArraySort($aSort)
$fichier_trier = FileOpen(@DeskTopDir & "\Test_Trier.txt", 10)
If $fichier_trier = -1 Then
MsgBox(16, "Erreur", "Impossible d'ouvrir le fichier txt.")
Exit
EndIf
For $i = 0 To UBound($aSort, 1) - 2
$NewLigne = StringSplit($aSort[$i],"#")
FileWrite($fichier_trier, $NewLigne[2] & @CRLF)
Next
FileClose($fichier_trier)
Exit
Bonne soirée, bonne nuit.
AutoITement.
Re: [...]Trier un fichier txt
Posté : ven. 06 mars 2009 23:11
par FernandG
Bonsoir (encore),
@Tlem Je viens de faire des tests avec les deux codes et c'est vraiment impressionnant.
J'ai généré un fichier txt exemple de 3Mo comportant 99235 lignes :
Temps d'exécution du code sans ReDim : Moyenne de 36s (lancé 5x)
Temps d'exécution du code avec ReDim : Stoppé au bout de 65 min, non terminé.
Nouveau fichier txt exemple de 145ko comportant 5000 lignes :
Temps d'exécution du code sans ReDim : Moyenne de 2,7s (lancé 5x)
Temps d'exécution du code avec ReDim : Moyenne de 57s (lancé 5x)
Les résultats se passent de commentaires.
Bonne soirée, bonne nuit.
AutoITement.
Re: [...]Trier un fichier txt
Posté : sam. 07 mars 2009 01:03
par Tlem
J'en avais déjà fait la douloureuse expérience, c'est pour cette raison que j'ai suggéré de ne pas utiliser la fonction
ReDim pour des tableaux qui risque de prendre du volume.
Pour des dimensions inférieures à 50 c'est acceptable, au delà, ça ce traîne.

Re: [...]Trier un fichier txt
Posté : mar. 10 mars 2009 09:52
par marsujp
Merci beaucoup !
Dsl de ne pas avoir repondu avant, mais je suis blacklisté chez moi...
Bref, merci encore pour le code, toutefois j'ai une erreur lorsque je l'execute, à la ligne suivante :
Code : Tout sélectionner
For $i = 0 To UBound($aSort, 1) - 2
$NewLigne = StringSplit($aSort[$i],"#")
[b]FileWrite($fichier_trier, $NewLigne[2] & @CRLF)[/b]
Next
Visiblement, le NewLigne[2] pose probleme...
Sinon, le fichier est bien trié, sauf la ligne qui devrait se trouver en derniere position, elle est vide...
Re: [..] Trier un fichier txt
Posté : jeu. 12 mars 2009 11:00
par ani
bonjour, je viend de tester l'exemple script & fichier.txt proposé par fernandG, tout fonctionne correctement, aucune erreur.
Surement votre fichier texte qui ne correspondrait pas avec la vérification du script ?
vous auriez un exemple ?
votre erreur est de ce style?
Code : Tout sélectionner
FileWrite($fichier_trier, $NewLigne[2] & @CRLF)
FileWrite($fichier_trier, ^ ERROR