|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Futur Membre du Club
![]() Inscription : mars 2002 Messages : 33 ![]() |
Bonjour,
J'ai un fichier avec sur chaque ligne le contenu d'un fichier XML. Par exemple : ligne 1 : <?xml version="1.0"><root><key>XXX</key>...</root> ligne 2 : <?xml version="1.0"><root><key>XXX</key>...</root> Et pour trier les lignes de ce fichier, j'extrait avec sed les 'XXX' de l'élément <key> que j'enregistre dans un fichier temporaire. Puis je trie ce fichier temp que je parcours ligne par ligne pour trier mon fichier de départ avec des grep. Cela donne : Code :
Merci! |
||
|
|
01
|
|
|
#2 |
|
Membre Expert
![]() |
si le début est toujours le même, tu peux peut-être utiliser ça :
Code :
sort -t'<' -k4,4 test.sort $SRC_FILE > $DST_FILE (Edit) sinon, avec perl (plus précis) : ignore la casse: Code :
perl -e 'my $table={}; while (<>) {if (/<key>(\w+)<\/key>/) {$table{$1}=$_;}} ; foreach $k (sort {uc($a) cmp uc($b)} keys %table) {print "$table{$k}"; }' $SRC_FILE > $DST_FILE Code :
perl -e 'my $table={}; while (<>) {if (/<key>(\w+)<\/key>/) {$table{$1}=$_;}} ; foreach $k (sort keys %table) {print "$table{$k}"; }' $SRC_FILE > $DST_FILE |
|
|
20
|
|
|
#3 |
|
Futur Membre du Club
![]() Inscription : mars 2002 Messages : 33 ![]() |
Merci pour ta réponse.
Le début peut varier, effectivement c'est dommage car avec juste sort j'aurais pu trier le fichier. Pour le perl, je connais pas du tout ce langage, c'est une bonne occasion pour m'y mettre un peu Je vais tester si niveau perf ta solution est plus intéressante. |
|
|
10
|
|
|
#4 | ||||||||
|
Membre Expert
![]() |
Alors 2 remarques :
1) je viens de remarquer avec ton script que ta clé est uniquement numérique, donc tu devrais utiliser sort -n mais ce n'est pas très important 2) côté perf, ne t’inquiète pas : perl est très fort Pour te donner un exemple, j'ai fait voulu faire un test. Pour mon premier essai, je me suis dit que j'allais faire un truc léger : 500 000 lignes à trier... mais je me suis emballé car j'ai du arrêter ton script (marre d'attendre) au bout de 6 minutes et 15 000 lignes traitées Donc le second essai : 50 000 lignes seulement. 1) création du fichier de test (je ne me suis pas pris la tête à changer le début, de toute façon, ça ne changerait rien au résultat ici) : Code :
Code :
Code :
Code :
Et il y aurait peut-être moyen d'améliorer si ce ne sont que des chiffres (en utilisant un tableau par ex.) |
||||||||
|
|
20
|
|
|
#5 | ||
|
Membre Expert
![]() |
Pour la forme (utilisation d'un tableau):
Code :
|
||
|
|
20
|
|
|
#6 |
|
Membre Expert
![]() |
Et comme je suis bon prince, j'explique le programme si tu ne connais pas perl
Code :
while (<>) {if (/<key>(\w+)<\/key>/) {$table{$1}=$_;}} ; foreach $k (sort {$a <=> $b} keys %table) {print "$table{$k}"; } Code :
if (/<key>(\w+)<\/key>/) {$table{$1}=$_;} Code :
foreach $k (sort {$a <=> $b} keys %table) {...} Affiche simplement la valeur correspondant à la clé $k, c'est à dire la ligne complète telle qu'elle avait été stockée au dessus... Exercice: analyser le programme utilisant un tableau |
|
|
20
|
|
|
#7 | ||||
|
Futur Membre du Club
![]() Inscription : mars 2002 Messages : 33 ![]() |
waaouuu merci pour toutes ces explications et d'avoir pris la peine de faire un test
![]() de mon côté, je n'ai testé que sur un fichier (100 Mo / 10000 lignes) pour le moment : Résultat avec le script initial Code :
Code :
Je sais ce qu'il me reste à faire! |
||||
|
|
10
|
Copyright © 2000-2012 - www.developpez.com