thales69 | 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 :
- #!C:/Perl/bin/perl.exe -w
- use strict;
- use warnings;
- use HTML::TreeBuilder;
- use LWP::Simple;
- my ($j, $i, $k, $l, $m, $ligne, $ligne1, $x, $y);
- my (@OA1) = ();
- # Je récupère le nombre d'équipes du championnat dans $nb_eq
- open(FR1A,'france1.txt');
- while(my $ligne = <FR1A> ) {
- $j++;
- }
-
- my $nb_eq = ($j-4)/4;
- close FR1A;
- #J'ouvre les deux fichiers concernés par le classement alphabetique
- open(A1,"france1_classements.txt" );
- open(A2,">ordre_alphabetique.txt" );
- # Je crée un tableau multidimensionnel @TdT qui contient tous les champs du fichier france1_classements.txt
- my(@TdT, @tmp);
- while($ligne = <A1> ) {
- @tmp = split(/;/,$ligne);
- push @TdT, [ @tmp];
- }
- # Je récupère dans @TdT uniquement les noms des équipes grace à la Regexp /(\w+\s)+/
- my @part = grep(/(\w+\s)+/,@TdT);
- # Boucle for pour remplir le tableau @part des $nb_eq équipes du championnat
- for ($i=0; $i<=$nb_eq-1;$i++) {
- push @part, $TdT[$i][1];
- }
- # Je classe par ordre lexical(alphabetique) les valeurs du tableau @part dans le tableau @OA
- my @OA = sort @part;
- #J'affiche dans le fichier ordre_alphabetique.txt les equipes dans l'ordre alphabetique
- for $i (0..($nb_eq-1)) {
- print A2 $OA[$i]."\n";
- }
- #Calcul du nombre de buts marqués total par toutes les équipes
- my $goals_for = 0;
- for($k=0; $k<=($nb_eq-1); $k++) {
- $goals_for += $TdT[$k][6];
- }
- #Calcul du nombre de buts encaissés total par toutes les équipes
- my $goals_against = 0;
- for($k=0; $k<=($nb_eq-1); $k++) {
- $goals_against += $TdT[$k][7];
- }
- print A2 "Nombre de buts marques:".$goals_for."\n";
- print A2 "Nombre de buts encaisses:".$goals_against;
- close A2;
- open(A3,"france1_classements.txt" );
- open(A4,">ordre_alphabetique1.txt" );
- for ($l=0; $l<=($nb_eq-1); $l++) {
- while ($ligne1 = <A3> ) {
- if( $ligne1 =~ /$OA[$l]/){
- push @OA1, $ligne1;
- }
- }
- }
- for ($m=0; $m<=4*$nb_eq; $m++) {
- print A4 $OA1[$m]."\n";
- }
- close A3;
- close A4;
- close A1;
|
Message édité par thales69 le 02-09-2012 à 15:41:35
|