Classement Longueur des mots

Classement Longueur des mots - Logiciels - Windows & Software

Marsh Posté le 27-08-2010 à 10:53:25    

Bonjour à tous,
 
Je vous expose mon problème. J'aurai besoin d'une astuce pour trier une liste de mots selon leur longueur. Si il faut un programme spécifique, expliquez moi quand même l'astuce :)
 
Merci de votre aide
 
Bonne journée

Reply

Marsh Posté le 27-08-2010 à 10:53:25   

Reply

Marsh Posté le 27-08-2010 à 12:23:48    

Par exemple avec le petit script VBS ci-dessous (testé).

' Tri d'un fichier sur la longueur de chacune de ses lignes
'
' Lit du fichier en entree, dans la chaine strITF
Set objFSO = CreateObject("Scripting.FileSystemObject" )  
Set objOTF = objFSO.OpenTextFile("fichier_a_lire.txt", 1)  
strOTF = objOTF.ReadAll  
Set objOTF = Nothing  
'
' Enleve le dernier retour à la ligne s'il existe
If (Right(strOTF, Len(vbCrLf)) = vbCrLf) Then  
   strOTF = Left(strOTF, Len(strOTF) - Len(vbCrLf))  
End If  
'
' Découpe la chaine dans un tableau
arrROW = Split(vbCrLf & strOTF, vbCrLf)  
Set strOTF = Nothing  
'
' Tri bulle du tableau
For i = LBound(arrROW) to UBound(arrROW)
   For j = LBound(arrROW) to UBound(arrROW)
      If (j < UBound(arrROW)) Then
         If (Len(arrROW(j)) > Len(arrROW(j + 1))) Then
            TempValue = arrROW(j + 1)
            arrROW(j + 1) = arrROW(j)
            arrROW(j) = TempValue
         End If
      End If
   Next
Next
'
' Ecrit le tableau dans un nouveau fichier
Set objOTF = objFSO.OpenTextFile("fichier_trie.txt", 2, True)
For Each s In arrROW
  objOTF.write s & vbCrLf
Next
Set objOTF = Nothing  
'
Set objFSO = Nothing  
WScript.Quit  

Il faut mettre ces ligne dans un fichier que l'on appellera, par exemple "tri_lg.vbs".
Pour l'exécuter, il suffit de cliquer dessus, dans l'explorateur Windows.
VBS est en standard depuis Windows 95 environ.

Reply

Marsh Posté le 27-08-2010 à 13:51:59    

J'apporte juste deux remarques de "pinailleur" ;)
 
1) VBS est langage interprété et particulièrement lent à l'exécution
2) Le tri par bulle si ma mémoire est bonne a une complexité algorithmique en n au carré dans le pire des cas... ce qui n'est vraiment pas terrible, un tri fusion est bien plus efficace (n log n) surtout si le nombre d'éléments est élevé.

Reply

Marsh Posté le 27-08-2010 à 14:10:26    

Saurais tu m'aider requin?

Reply

Marsh Posté le 27-08-2010 à 14:14:24    

As-tu des problèmes de performance avec ce qui t'a été proposé par olivthill ?
 
Car si les temps d'exécution sont acceptables il n'y a pas lieu de chercher.

Reply

Marsh Posté le 27-08-2010 à 14:26:48    

Ok, regardons les performances.
Je rajoute, au début

Start = Now  

Et je rajoute à la fin

Wscript.Echo DateDiff("s", Start, Now)


Je teste avec un fichier de 1000 lignes de 20 caractères en moyenne, sur mon vieil ordinateur de base.
 
J'obtiens le fichier trié en 0 seconde et quelques poussières.
 
N.B. Si on travaille avec des fichiers très gros, on risque d'atteindre les limites de la fonction ReadAll et il faudrait la remplacer par une boucle et des ReadLine.
 
EDIT : Un test avec un fichier de 730 ko contenant 25.000 lignes passe sans problème avec ReadAll, mais cela prend 18 minutes.


Message édité par olivthill le 27-08-2010 à 15:18:26
Reply

Marsh Posté le 27-08-2010 à 15:36:44    

C'est pas que ça va ou pas c'est que je n'arrive pas à faire la démarche de oliv

Reply

Marsh Posté le 27-08-2010 à 15:48:19    

Quand je lance le fichier, il me met erreur, fichier introuvable

Reply

Marsh Posté le 27-08-2010 à 16:11:22    

Voilà j'ai réussi mais ça bug assez bien sur ma liste de 100 000 lignes

Reply

Marsh Posté le 27-08-2010 à 16:15:36    

Ouaip 100000 éléments tu auras déjà un gain significatif en changeant l'algo pour un merge sort (tri fusion)...  
 
As-tu besoin de régulièrement trier ces 100000 éléments ou c'était juste 1x ?

Reply

Marsh Posté le 27-08-2010 à 16:15:36   

Reply

Marsh Posté le 27-08-2010 à 16:17:51    

J'ai plus où 6 millions à traiter là :)

Reply

Marsh Posté le 27-08-2010 à 16:22:41    

Ok vais voir si j'ai un moment pour faire un truc ce week-end...

Reply

Marsh Posté le 27-08-2010 à 16:23:59    

D'accord Merci Beaucoup :)

Reply

Marsh Posté le 28-08-2010 à 17:59:44    

Salut,
 
le bidule est fait en Java, tu peux le télécharger sous :
http://www.rathgeb.org/temp/SortByLength.jar
 
J'ai mis le code source avec si cela t'intéresse ou que tu as besoin de faire des ajustements tu trouveras les fichiers *.java dans le JAR (un fichier JAR s'ouvre comme un ZIP... change juste l'extension)
 
Il te faut bien entendu une JVM 1.6 pour exécuter le logiciel, si tu n'en as pas une d'installée sur http://java.sun.com le JDK 1.6 Update 21 fera l'affaire.
 
Le programme s'utilise de la manière suivante :

java -jar SortByLength.jar [source] [destination] [encodage]


 
Pour l'encodage généralement les fichiers sont le plus souvent en ISO-8859-1 ou UTF-8, plus rarement en UTF-16. Ce qui donne par exemple :

java -jar SortByLength.jar atrier.txt trie.txt ISO-8859-1


 
Si tu vois des problèmes avec les caractères accentués, il faudra changer l'encodage utilisé pour l'ajuster à tes fichiers. Le caractère de retour à la ligne utilisé est dépendant de ton système (Win, Linux, ...).
 
Au niveau du fonctionnement le logiciel lit ligne par ligne ton fichier d'entrée. Puis une fois en mémoire trie le tout en utilisant Collections.sort() qui implémente un tri par fusion et finalement écrit ligne par ligne le fichier. Ca devrait être bien plus rapide que du VBS sans être non plus forcément l'implémentation la plus rapide possible.
 
Voilà tu pourras dire au passage merci à John von Neumann ;)

Reply

Marsh Posté le 29-08-2010 à 11:42:23    

Je n'arrive pas à suivre ta démarche :). Saurait tu m'expliquer en détaillant plus les manipulations à faire Merci beaucoup

Reply

Marsh Posté le 29-08-2010 à 19:47:24    

1) créer un dossier où tu met le fichier http://www.rathgeb.org/temp/SortByLength.jar et tes fichiers à trier (par exemple C:\SortByLength)
2) Sous XP démarrer -> exécuter -> cmd -> bouton OK (sous Vista & Seven démarrer -> cmd -> entrée)
3) Saisi à l'invite de commande (= la fenêtre noire) 'java -version' (sans guillemets) suivi de entrée, ca doit te donner qqch du genre :

java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b07)
Java HotSpot(TM) 64-Bit Server VM (build 17.0-b17, mixed mode)

Si tu as :

'java' n'est pas reconnu en tant que commande interne
ou externe, un programme exécutable ou un fichier de commandes.

C'est que tu n'as pas l'environnement Java installé, donc télécharge le fichier http://www.oracle.com/technetwork/ [...] 36632.html et installe le et relance ensuite 'java -version' du point 3
4) Ensuite avec l'invite de commande navigue vers le dossier précédemment créé : 'cd c:\SortByLength' (suivi de entrée et sans guillemets)
5) Ensuite saisi à l'invite de commande 'java -jar SortByLength.jar atrier.txt trie.txt ISO-8859-1' où atrier.txt est le fichier que tu veux trier et trie.txt le fichier trié.

Reply

Marsh Posté le 30-08-2010 à 00:47:03    

Waw merci beaucoup, c'est nickel et d'une vitesse impressionnante :). Un grand merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed