Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1891 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Boucle while dans boucle for

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Boucle while dans boucle for

n°2155300
thales69
Posté le 02-09-2012 à 15:39:25  profilanswer
 

Bonjour,
 
j'ai un petit souci avec ce script qui doit classer 80 lignes dans l'ordre alphabétique par rapport aux noms des équipes.
 
J'ai un fichier france1_classements.pl que voilà:
 

Spoiler :

1;Marseille ;3;3;0;0;4;0
2;Lyon ;3;2;1;0;6;2
3;Valenciennes ;3;2;1;0;4;0
4;Toulouse ;3;2;1;0;4;2
5;Bordeaux ;3;2;1;0;4;2
6;Bastia ;3;2;0;1;7;6
7;Lorient ;3;1;2;0;6;5
8;Lille ;3;1;2;0;5;4
9;Nancy ;3;1;1;1;2;2
10;St Etienne ;3;1;0;2;6;4
11;Paris SG ;3;0;3;0;2;2
12;Rennes ;3;1;0;2;3;4
13;Reims ;3;1;0;2;2;3
14;Brest ;3;1;0;2;1;5
15;Nice ;3;0;2;1;2;3
16;Ajaccio ;3;1;1;1;1;3
17;Evian TG ;3;0;1;2;3;5
18;Montpellier ;3;0;1;2;2;4
19;Troyes ;3;0;1;2;3;7
20;Sochaux ;3;0;0;3;2;6
1;Valenciennes ;2;1;1;0;3;0
2;St Etienne ;2;1;0;1;5;2
3;Lyon ;1;1;0;0;4;1
4;Marseille ;1;1;0;0;2;0
5;Lorient ;1;1;0;0;2;1
6;Bastia ;1;1;0;0;2;1
7;Toulouse ;1;1;0;0;2;1
8;Brest ;1;1;0;0;1;0
9;Bordeaux ;1;1;0;0;1;0
10;Rennes ;2;1;0;1;3;3
11;Nancy ;2;1;0;1;1;1
12;Reims ;2;1;0;1;1;1
13;Paris SG ;2;0;2;0;2;2
14;Lille ;1;0;1;0;1;1
15;Ajaccio ;1;0;1;0;0;0
16;Evian TG ;2;0;1;1;3;4
17;Nice ;2;0;1;1;2;3
18;Troyes ;2;0;1;1;2;3
19;Montpellier ;2;0;1;1;1;2
20;Sochaux ;1;0;0;1;2;3
1;Marseille ;2;2;0;0;2;0
2;Lille ;2;1;1;0;4;3
3;Bordeaux ;2;1;1;0;3;2
4;Toulouse ;2;1;1;0;2;1
5;Lyon ;2;1;1;0;2;1
6;Valenciennes ;1;1;0;0;1;0
7;Bastia ;2;1;0;1;5;5
8;Ajaccio ;2;1;0;1;1;3
9;Lorient ;2;0;2;0;4;4
10;Nancy ;1;0;1;0;1;1
11;Nice ;1;0;1;0;0;0
12;Paris SG ;1;0;1;0;0;0
13;St Etienne ;1;0;0;1;1;2
14;Montpellier ;1;0;0;1;1;2
15;Reims ;1;0;0;1;1;2
16;Evian TG ;1;0;0;1;0;1
17;Rennes ;1;0;0;1;0;1
18;Troyes ;1;0;0;1;1;4
19;Sochaux ;2;0;0;2;0;3
20;Brest ;2;0;0;2;0;5
1;Marseille ;3;3;0;0;4;0
2;Lyon ;3;2;1;0;6;2
3;Valenciennes ;3;2;1;0;4;0
4;Toulouse ;3;2;1;0;4;2
5;Bordeaux ;3;2;1;0;4;2
6;Bastia ;3;2;0;1;7;6
7;Lorient ;3;1;2;0;6;5
8;Lille ;3;1;2;0;5;4
9;Nancy ;3;1;1;1;2;2
10;Ajaccio ;3;1;1;1;1;3
11;St Etienne ;3;1;0;2;6;4
12;Paris SG ;3;0;3;0;2;2
13;Rennes ;3;1;0;2;3;4
14;Reims ;3;1;0;2;2;3
15;Brest ;3;1;0;2;1;5
16;Nice ;3;0;2;1;2;3
17;Evian TG ;3;0;1;2;3;5
18;Montpellier ;3;0;1;2;2;4
19;Troyes ;3;0;1;2;3;7
20;Sochaux ;3;0;0;3;2;6
 
Nombre de lignes: 80
 
Nombre d'equipes: 20


 
et je veux classer ces lignes comme ceci (Equipes dans l'ordre alphabétique et dans l'ordre où elles se présentent dans le fichier):

Spoiler :


16;Ajaccio ;3;1;1;1;1;3
15;Ajaccio ;1;0;1;0;0;0
8;Ajaccio ;2;1;0;1;1;3
10;Ajaccio ;3;1;1;1;1;3
6;Bastia ;3;2;0;1;7;6
6;Bastia ;1;1;0;0;2;1
7;Bastia ;2;1;0;1;5;5
6;Bastia ;3;2;0;1;7;6
5;Bordeaux ;3;2;1;0;4;2
9;Bordeaux ;1;1;0;0;1;0
3;Bordeaux ;2;1;1;0;3;2
5;Bordeaux ;3;2;1;0;4;2
14;Brest ;3;1;0;2;1;5
8;Brest ;1;1;0;0;1;0
20;Brest ;2;0;0;2;0;5
15;Brest ;3;1;0;2;1;5
...
...
...
...
19;Troyes ;3;0;1;2;3;7
18;Troyes ;2;0;1;1;2;3
18;Troyes ;1;0;0;1;1;4
19;Troyes ;3;0;1;2;3;7
3;Valenciennes ;3;2;1;0;4;0
1;Valenciennes ;2;1;1;0;3;0
6;Valenciennes ;1;1;0;0;1;0
3;Valenciennes ;3;2;1;0;4;0


 
 
Voici ce que j'ai fait (La partie de code qui ne fonctionne pas correctement est à partir de la ligne 63 où j'utilise le tableau @OA dans lequel je récupère uniquement les noms des équipes dans l'ordre alphabétique). Quand je le fait fonctionner j'ai un warning "Use of uninitialized value within @OA1 in concatenation (.) or string at ordre_alphabetique.pl line 75, <A3> line 84" et dans mon fichier ordre_alphabetique1.txt j'obtiens uniquement les 4 premières lignes de l'équipe d'Ajaccio et c'est tout !
Je me demande si on a le droit de faire une boucle while de lecture de fichier dans une boucle for ? J'ai l'impression que ma boucle s'arrête et ne relis pas le fichier france1_classements.txt pour $l=1. Qu'est-ce que je fais faux dans cette boucle ? Une idée? Merci.
 
 

Code :
  1. #!C:/Perl/bin/perl.exe -w
  2. use strict;
  3. use warnings;
  4. use HTML::TreeBuilder;
  5. use LWP::Simple;
  6. my ($j, $i, $k, $l, $m, $ligne, $ligne1, $x, $y);
  7. my (@OA1) = ();
  8. # Je récupère le nombre d'équipes du championnat dans $nb_eq
  9. open(FR1A,'france1.txt');
  10. while(my $ligne = <FR1A> ) {
  11. $j++;
  12.    }
  13.  
  14. my $nb_eq = ($j-4)/4;
  15. close FR1A;
  16. #J'ouvre les deux fichiers concernés par le classement alphabetique
  17. open(A1,"france1_classements.txt" );
  18. open(A2,">ordre_alphabetique.txt" );
  19. # Je crée un tableau multidimensionnel @TdT qui contient tous les champs du fichier france1_classements.txt
  20. my(@TdT, @tmp);
  21. while($ligne = <A1> ) {
  22. @tmp = split(/;/,$ligne);
  23. push @TdT, [ @tmp];
  24.   }
  25. # Je récupère dans @TdT uniquement les noms des équipes grace à la Regexp /(\w+\s)+/
  26. my @part = grep(/(\w+\s)+/,@TdT);
  27. # Boucle for pour remplir le tableau @part des $nb_eq équipes du championnat
  28. for ($i=0; $i<=$nb_eq-1;$i++) {
  29.  push @part, $TdT[$i][1];
  30. }
  31. # Je classe par ordre lexical(alphabetique) les valeurs du tableau @part dans le tableau @OA
  32. my @OA = sort @part;
  33. #J'affiche dans le fichier ordre_alphabetique.txt les equipes dans l'ordre alphabetique
  34. for $i (0..($nb_eq-1)) {
  35. print A2 $OA[$i]."\n";
  36. }
  37. #Calcul du nombre de buts marqués total par toutes les équipes
  38. my $goals_for = 0;
  39. for($k=0; $k<=($nb_eq-1); $k++) {
  40. $goals_for += $TdT[$k][6];
  41. }
  42. #Calcul du nombre de buts encaissés total par toutes les équipes
  43. my $goals_against = 0;
  44. for($k=0; $k<=($nb_eq-1); $k++) {
  45. $goals_against += $TdT[$k][7];
  46. }
  47. print A2 "Nombre de buts marques:".$goals_for."\n";
  48. print A2 "Nombre de buts encaisses:".$goals_against;
  49. close A2;
  50. open(A3,"france1_classements.txt" );
  51. open(A4,">ordre_alphabetique1.txt" );
  52. for ($l=0; $l<=($nb_eq-1); $l++) {
  53. while ($ligne1 = <A3> ) {
  54. if( $ligne1 =~ /$OA[$l]/){
  55.  push @OA1, $ligne1;
  56. }
  57. }
  58. }
  59. for ($m=0; $m<=4*$nb_eq; $m++) {
  60. print A4 $OA1[$m]."\n";
  61. }
  62. close A3;
  63. close A4;
  64. close A1;


Message édité par thales69 le 02-09-2012 à 15:41:35
mood
Publicité
Posté le 02-09-2012 à 15:39:25  profilanswer
 

n°2155304
thales69
Posté le 02-09-2012 à 16:29:08  profilanswer
 

Bon ben pour une fois je viens de trouver une solution en utilisant la fonction seek(A3, 0, 0) qui remet le curseur au début du fichier. Par contre j'ai toujours un warning "Use of uninitialized value in print at ordre_alphabetique.pl line 76, <A3> line 1680." ? En tous cas ça me sort bien le fichier que je voulais :)
 

Code :
  1. for ($l=0; $l<=($nb_eq-1); $l++) {
  2. while ($ligne1 = <A3> ) {
  3. if( $ligne1 =~ /$OA[$l]/){
  4.  push @OA1, $ligne1;
  5. }
  6. }
  7. seek(A3, 0, 0);
  8. }


Message édité par thales69 le 02-09-2012 à 16:31:10
n°2155305
gilou
Modérateur
Modzilla
Posté le 02-09-2012 à 16:39:03  profilanswer
 

Citation :

et je veux classer ces lignes comme ceci (Equipes dans l'ordre alphabétique et dans l'ordre où elles se présentent dans le fichier):

 
C'est très simple:

Code :
  1. #!/usr/local/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. open(my $IN, 'teams.txt');
  6. my @out = map $_->[0], sort { $a->[2] cmp $b->[2] } map [$_, split /;/], <$IN>;
  7. close($IN);
  8.  
  9. print " @out";


 
En entrée: teams.txt
 

1;Marseille ;3;3;0;0;4;0  
2;Lyon ;3;2;1;0;6;2  
3;Valenciennes ;3;2;1;0;4;0  
4;Toulouse ;3;2;1;0;4;2  
5;Bordeaux ;3;2;1;0;4;2  
6;Bastia ;3;2;0;1;7;6  
7;Lorient ;3;1;2;0;6;5  
8;Lille ;3;1;2;0;5;4  
9;Nancy ;3;1;1;1;2;2  
10;St Etienne ;3;1;0;2;6;4  
11;Paris SG ;3;0;3;0;2;2  
12;Rennes ;3;1;0;2;3;4  
13;Reims ;3;1;0;2;2;3  
14;Brest ;3;1;0;2;1;5  
15;Nice ;3;0;2;1;2;3  
16;Ajaccio ;3;1;1;1;1;3  
17;Evian TG ;3;0;1;2;3;5  
18;Montpellier ;3;0;1;2;2;4  
19;Troyes ;3;0;1;2;3;7  
20;Sochaux ;3;0;0;3;2;6  
1;Valenciennes ;2;1;1;0;3;0  
2;St Etienne ;2;1;0;1;5;2  
3;Lyon ;1;1;0;0;4;1  
4;Marseille ;1;1;0;0;2;0  
5;Lorient ;1;1;0;0;2;1  
6;Bastia ;1;1;0;0;2;1  
7;Toulouse ;1;1;0;0;2;1  
8;Brest ;1;1;0;0;1;0  
9;Bordeaux ;1;1;0;0;1;0  
10;Rennes ;2;1;0;1;3;3  
11;Nancy ;2;1;0;1;1;1  
12;Reims ;2;1;0;1;1;1  
13;Paris SG ;2;0;2;0;2;2  
14;Lille ;1;0;1;0;1;1  
15;Ajaccio ;1;0;1;0;0;0  
16;Evian TG ;2;0;1;1;3;4  
17;Nice ;2;0;1;1;2;3  
18;Troyes ;2;0;1;1;2;3  
19;Montpellier ;2;0;1;1;1;2  
20;Sochaux ;1;0;0;1;2;3  
1;Marseille ;2;2;0;0;2;0  
2;Lille ;2;1;1;0;4;3  
3;Bordeaux ;2;1;1;0;3;2  
4;Toulouse ;2;1;1;0;2;1  
5;Lyon ;2;1;1;0;2;1  
6;Valenciennes ;1;1;0;0;1;0  
7;Bastia ;2;1;0;1;5;5  
8;Ajaccio ;2;1;0;1;1;3  
9;Lorient ;2;0;2;0;4;4  
10;Nancy ;1;0;1;0;1;1  
11;Nice ;1;0;1;0;0;0  
12;Paris SG ;1;0;1;0;0;0  
13;St Etienne ;1;0;0;1;1;2  
14;Montpellier ;1;0;0;1;1;2  
15;Reims ;1;0;0;1;1;2  
16;Evian TG ;1;0;0;1;0;1  
17;Rennes ;1;0;0;1;0;1  
18;Troyes ;1;0;0;1;1;4  
19;Sochaux ;2;0;0;2;0;3  
20;Brest ;2;0;0;2;0;5  
1;Marseille ;3;3;0;0;4;0  
2;Lyon ;3;2;1;0;6;2  
3;Valenciennes ;3;2;1;0;4;0  
4;Toulouse ;3;2;1;0;4;2  
5;Bordeaux ;3;2;1;0;4;2  
6;Bastia ;3;2;0;1;7;6  
7;Lorient ;3;1;2;0;6;5  
8;Lille ;3;1;2;0;5;4  
9;Nancy ;3;1;1;1;2;2  
10;Ajaccio ;3;1;1;1;1;3  
11;St Etienne ;3;1;0;2;6;4  
12;Paris SG ;3;0;3;0;2;2  
13;Rennes ;3;1;0;2;3;4  
14;Reims ;3;1;0;2;2;3  
15;Brest ;3;1;0;2;1;5  
16;Nice ;3;0;2;1;2;3  
17;Evian TG ;3;0;1;2;3;5  
18;Montpellier ;3;0;1;2;2;4  
19;Troyes ;3;0;1;2;3;7  
20;Sochaux ;3;0;0;3;2;6  


 
et en sortie:
 

C:\Perl>perl sortit.pl
 16;Ajaccio ;3;1;1;1;1;3
 15;Ajaccio ;1;0;1;0;0;0
 8;Ajaccio ;2;1;0;1;1;3
 10;Ajaccio ;3;1;1;1;1;3
 6;Bastia ;3;2;0;1;7;6
 6;Bastia ;1;1;0;0;2;1
 7;Bastia ;2;1;0;1;5;5
 6;Bastia ;3;2;0;1;7;6
 5;Bordeaux ;3;2;1;0;4;2
 9;Bordeaux ;1;1;0;0;1;0
 3;Bordeaux ;2;1;1;0;3;2
 5;Bordeaux ;3;2;1;0;4;2
 14;Brest ;3;1;0;2;1;5
 8;Brest ;1;1;0;0;1;0
 20;Brest ;2;0;0;2;0;5
 15;Brest ;3;1;0;2;1;5
 17;Evian TG ;3;0;1;2;3;5
 16;Evian TG ;2;0;1;1;3;4
 16;Evian TG ;1;0;0;1;0;1
 17;Evian TG ;3;0;1;2;3;5
 8;Lille ;3;1;2;0;5;4
 14;Lille ;1;0;1;0;1;1
 2;Lille ;2;1;1;0;4;3
 8;Lille ;3;1;2;0;5;4
 7;Lorient ;3;1;2;0;6;5
 5;Lorient ;1;1;0;0;2;1
 9;Lorient ;2;0;2;0;4;4
 7;Lorient ;3;1;2;0;6;5
 2;Lyon ;3;2;1;0;6;2
 3;Lyon ;1;1;0;0;4;1
 5;Lyon ;2;1;1;0;2;1
 2;Lyon ;3;2;1;0;6;2
 1;Marseille ;3;3;0;0;4;0
 4;Marseille ;1;1;0;0;2;0
 1;Marseille ;2;2;0;0;2;0
 1;Marseille ;3;3;0;0;4;0
 18;Montpellier ;3;0;1;2;2;4
 19;Montpellier ;2;0;1;1;1;2
 14;Montpellier ;1;0;0;1;1;2
 18;Montpellier ;3;0;1;2;2;4
 9;Nancy ;3;1;1;1;2;2
 11;Nancy ;2;1;0;1;1;1
 10;Nancy ;1;0;1;0;1;1
 9;Nancy ;3;1;1;1;2;2
 15;Nice ;3;0;2;1;2;3
 17;Nice ;2;0;1;1;2;3
 11;Nice ;1;0;1;0;0;0
 16;Nice ;3;0;2;1;2;3
 11;Paris SG ;3;0;3;0;2;2
 13;Paris SG ;2;0;2;0;2;2
 12;Paris SG ;1;0;1;0;0;0
 12;Paris SG ;3;0;3;0;2;2
 13;Reims ;3;1;0;2;2;3
 12;Reims ;2;1;0;1;1;1
 15;Reims ;1;0;0;1;1;2
 14;Reims ;3;1;0;2;2;3
 12;Rennes ;3;1;0;2;3;4
 10;Rennes ;2;1;0;1;3;3
 17;Rennes ;1;0;0;1;0;1
 13;Rennes ;3;1;0;2;3;4
 20;Sochaux ;3;0;0;3;2;6
 20;Sochaux ;1;0;0;1;2;3
 19;Sochaux ;2;0;0;2;0;3
 20;Sochaux ;3;0;0;3;2;6
 10;St Etienne ;3;1;0;2;6;4
 2;St Etienne ;2;1;0;1;5;2
 13;St Etienne ;1;0;0;1;1;2
 11;St Etienne ;3;1;0;2;6;4
 4;Toulouse ;3;2;1;0;4;2
 7;Toulouse ;1;1;0;0;2;1
 4;Toulouse ;2;1;1;0;2;1
 4;Toulouse ;3;2;1;0;4;2
 19;Troyes ;3;0;1;2;3;7
 18;Troyes ;2;0;1;1;2;3
 18;Troyes ;1;0;0;1;1;4
 19;Troyes ;3;0;1;2;3;7
 3;Valenciennes ;3;2;1;0;4;0
 1;Valenciennes ;2;1;1;0;3;0
 6;Valenciennes ;1;1;0;0;1;0
 3;Valenciennes ;3;2;1;0;4;0
 


 
C'est juste une application de la technique indiquée dans mon troisième post du topic trucs et astuces en perl.
 
EDIT: version amélioirée qui traite un peux mieux les "\n" de fin de ligne:

Code :
  1. #!/usr/local/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. open(my $IN, 'teams.txt');
  6. my @out = map $_->[0], sort { $a->[2] cmp $b->[2] } map {chomp; [$_, split /;/]} <$IN>;
  7. close($IN);
  8.  
  9. print join("\n", @out);


 
A+,


Message édité par gilou le 02-09-2012 à 16:55:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2155314
thales69
Posté le 02-09-2012 à 18:58:07  profilanswer
 

Merci Gilou, effectivement en 4 lignes tu fais ce que j'ai fais en 30 lignes,  pour de l'optimisation c'est de l'optimisation !! Mais bon même si je code bourrin je progresse quand même.
En tous cas je vais pas me priver de prendre ces 4 lignes à la place des miennes :)
 
A+

n°2155317
gilou
Modérateur
Modzilla
Posté le 02-09-2012 à 21:00:05  profilanswer
 

Faut pas t'inquiéter, on a tous commencé à faire comme tu fais, jusqu'au jour ou on est tombé sur un exemple de cette technique.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Boucle while dans boucle for

 

Sujets relatifs
[VBS] boucle do while not pour tester le mappage d'un lecteurBoucle While dans un script Ksh
Problème boucle while[Résolu] Update multiple dans une boucle while
Equivalence boucle while(- && - && -) et while (- || - || -)Pb de boucle While avec 2 bases
Problème avec boucle while qui ne s'arrêt pasboucle while
[Oracle & PHP] boucle if dans while : problèmeMise en forme d'une boucle while()
Plus de sujets relatifs à : Boucle while dans boucle for


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR