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.. :)