samedi 28 août 2010

Tri numérique

Pour trier des données on a la commande SORT.EXE mais malheureusement elle n'effectue que le trie alphabétique:
Salut,


Pour trier des données on a la commande SORT.EXE mais malheureusement elle n'effectue que le trie alphabétique:

c:\> type fichier1.txt

1 marcoc
2 libye
3 palestine
4 france

c:\> sort /r /+2 fichier1.txt /o trier.txt
c:\> type trier.txt

3 palestine
1 maroc
2 libye
4 france


un autre exemple:

c:\> type fichier2.txt

5
3
6
1

c:\> sort fichier2.txt

1
3
5
6


jusqu'ici tout marche à la perfection, voyons maintenant cette exemple:
c:\> type fichier3.txt

65
1
26894
1125
369

c:\> sort fichier3.txt

1
1125
26894
369
65

comme vous voyez la commande SORT.EXE ne connait pas le trie numérique.

pour contourner ce problème, on peux utiliser la commande externe "gnu sort" avec l'option "-n"
c:\> gnusort -n fichier3.txt

1
65
369
1125
26894

une autre solution est de faire un script émulant la commande "gnusort -n".

Donc l'une des solution possible est de fixer la longueur des chaine de caractères pour qu'il aillent la même longueur, pour se faire on va ajouter des zero "0" à gauche de chaque chaine:
00000001
00001125
00026894
00000369
00000065

ensuite on va les passer à la commande SORT.EXE

c:\> Sort fichier4.txt
00000001
00000065
00000369
00001125
00026894

le trie est effectuer avec succès il nous ne reste plus qu'a enlever les zeros "0" de plus.
1
65
369
1125
26894

et voilà voyons notre script de quoi aura l'air:
@Echo oFF
Setlocal EnableExtensions

Set liste=1 1125 26894 369 65 396

For %%i in (%liste%) Do >>~@ Call :S %%i
For /F "Tokens=*" %%c in ('Sort ~@') do Call:P set "c=%%c"
del ~@
pause
Endlocal & goto :EOF

:S
Set "tz=00000000%1"
Echo:%tz:~-8%
goto :EOF

:P
%*
:z
if (%c:~0,1%)==(0) set "c=%c:~1%" & goto:z
echo=%c% 
goto:EOF


comme vous voyez c'est le bordel !! On essayera alors une autre solution,...que dites-vous de
comparer les nombres, nombre par nombre en décalant chaque chiffre de gauche à droite, le plus grand nombre sera décalé à droite et le plus petit à gauche ? un SORT à bulle...quoi..
@Echo oFF

Call :Sort 1256 280 3 10 2 98 259 563 8
pause
goto :EOF


:Sort
Setlocal EnableDelayedExpansion
Set/A n=1,s=0,c=s,r=s
for %%: In (%*) do (
    Set /a c+=1
    Set "nm.!c!=%%:")
:LP.1
if %s% EQU %c% Set/A n+=1,s=0
    Set/A s+=1
    Call :SPL %n% %s%
If %n% LEQ %c% goto :LP.1
:LP.2
    Echo:!nm.%c%!
    Set/A c-=1
If %c% GTR 0 goto :LP.2 
Endlocal & goto :EOF
:SPL
 If !nm.%1! GTR !nm.%2! (
   Set "t=!nm.%2!"&Set "nm.%2=!nm.%1!"
   Set "nm.%1=!t!"
 ) 
goto :EOF

c'est plus simple..non.. :)

Aucun commentaire: