(supersedes <mn.231f7d8702db0a92.79899@wanadoo.fr>)
Olivier Miakinen, le 04/07/2008 a écrit :
Le 04/07/2008 11:31, Thierry Loiseau a écrit :
Comment faire pour réordonner ceci, réenregistrer dans un autre fichier
texte de telle sorte que la première ligne représente le numéro le plus
grand qui se trouve entre parenthèses et en sous-ordre, le numéro se
trouvant en début de la ligne ?
function cmp($a, $b)
{
preg_match("/([0-9]+).[\r\n]*$/", $a, $ma);
preg_match("/([0-9]+).[\r\n]*$/", $b, $mb);
return $mb[1] - $ma[1]; // b - a car ordre inverse
}
$contenu = file($inputfile);
usort($contenu, 'cmp');
file_put_contents($outputfile, implode("\n", $contenu)."\n");
Note que tu pourrais utiliser l'option FILE_IGNORE_NEW_LINES pour la
fonction file() et du coup supprimer le [\r\n]* des regexp, mais il
paraît qu'il peut y avoir des problèmes si tu lis un fichier en format
DOS sur un Unix ou le contraire. Inversement, il faudra peut-être
adapter le "\n" au moment de la réécriture.
J'ai du mal à voir comment ça marche. Je vais faire tourner le truc, puisque je me remets à faire un peu de PHP, donc que je traîne dans le coin.
Puisque je corrige, j'ajoute:
J'ai quand même fait tourner le truc, et effectivement, il me semble que ça ne trie pas sur le second niveau. A moins que je n'ai pas pigé l'énoncé...
En python, pas particulièrement compact, on doit pouvoir faire proche en PHP:
tri1 = lambda x, y: cmp(int(y.split('(')[-1].rstrip()[:-1]), int(x.split('(')[-1].rstrip()[:-1]))
tri2 = lambda x, y: cmp(int(y.split(':')[0]), int(x.split(':')[0]))
tri = lambda x, y: tri1(x, y) or tri2(x, y)
s = open('in.txt', 'r').readlines().sort(cmp=tri)
open('out.txt', 'w').write(''.join(s))
Correction:
....
s = open('in.txt', 'r').readlines()
s.sort(cmp=tri)
open('out.txt', 'w').write(''.join(s))
--
Pierre Maurette