Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Langage
Langage Toutes vos questions sur les scripts Perl en général. Avant de poster, veuillez consulter les FAQs perl, les cours Perl, les critiques de livres et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/12/2012, 18h06   #1
étoile de mer
Débutant
 
Avatar de étoile de mer
 
Étudiant
Inscription : avril 2007
Messages : 940
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2007
Messages : 940
Points : 72
Points : 72
Par défaut Somme de valeur

Bonjour à tous,
J'ai besoin d'une aide concernant un probleme:
En fait j'ai un fichier 1 qui contient des ligne et des valeur sous cette forme :
bonjour 1
les 3
Amis 5


un Deuxieme fichier :
bonjour 1
les 2
Amis 4

je cherche une idee comment qui lit ces 2 fichier et qui produit un fichier somme de valeur sous cette forme

bonjour 2
les 5
Amis 9

Merci pour votr aide
__________________
Le jour est le père du labeur et la nuit est la mère des pensées.
étoile de mer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2012, 19h16   #2
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 567
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 567
Points : 1 117
Points : 1 117
Bonjour,

si je suppose que la règle est que les chiffres à additionner sont toujours la dernière information sur la ligne du fichier, je peux faire un truc dans ce genre:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my ($fichier1, $fichier2) = qw / fichier1.txt fichier 2.txt/;
open my $FIC1, "<", $fichier1, or die "impossible ouvrir $fichier1 $! \n";
open my $FIC2, "<", $fichier2, or die "impossible ouvrir $fichier2 $! \n";
 
while (my $line1 = <$FIC1>) {
     chomp $line1;
     my ($texte, $value1) = ($1, $2) if $line1 =~ /^([\w\s]+)(\d+)$/;
     my $line2 = <$FIC2>;
     chomp $line2;
     my $value2 = $1 if $line2 =~ /(\d+)$/;
     my $tot_val = $value1 + $value2;
     print "$texte $tot_value\n";
}
close $FIC1;
close $FIC2;
Il n'y a bien sûr aucun contrôle que le texte récupéré dans le fichier 1 correspond à celui qui se trouve dans le fichier2, on suppose que leur construction est bien parallèle et correcte.

Le résultat est ici imprimé à l'écran (et peut être redirigé vers un fichier le cas échéant), mais il n'est pas difficile d'ouvrir un troisième fichier pour écrire dans celui-ci.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/12/2012, 16h56   #3
étoile de mer
Débutant
 
Avatar de étoile de mer
 
Étudiant
Inscription : avril 2007
Messages : 940
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2007
Messages : 940
Points : 72
Points : 72
Merci Lolo87 pour votre aide precieuse,
J'ai essayé de compiler ce script, mais il maffiche ce message :
Execution of ./perl.pl aborted due to compilation errors.
je pense une erreur au niveau de la ligne 7


Avez vous une idée svp?
Merci
__________________
Le jour est le père du labeur et la nuit est la mère des pensées.
étoile de mer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2012, 20h03   #4
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 567
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 567
Points : 1 117
Points : 1 117
Citation:
Envoyé par étoile de mer Voir le message
J'ai essayé de compiler ce script, mais il maffiche ce message :
Execution of ./perl.pl aborted due to compilation errors.
je pense une erreur au niveau de la ligne 7
Je viens de compiler chez moi un copier-coller exact du code posté ci-dessus, je n'ai aucun problème:

Code :
1
2
$ perl -c add.pl
add.pl syntax OK
As-tu changé quelque chose?

Il y avait cependant deux petites erreurs:

Code :
my ($fichier1, $fichier2) = qw / fichier1.txt fichier 2.txt/;
Enlever l'espace entre fichier et 2.txt

Code :
my ($fichier1, $fichier2) = qw / fichier1.txt fichier2.txt/;
Et corriger la ligne d'impression à la fin, remplacer $total_value par $total_val.:

Code :
print "$texte $tot_val\n";
Et là, ça imprime:

Code :
1
2
3
bonjour 2
les 5
Amis 9
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/12/2012, 20h45   #5
étoile de mer
Débutant
 
Avatar de étoile de mer
 
Étudiant
Inscription : avril 2007
Messages : 940
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2007
Messages : 940
Points : 72
Points : 72
Citation:
Envoyé par Lolo78 Voir le message
Je viens de compiler chez moi un copier-coller exact du code posté ci-dessus, je n'ai aucun problème:

Code :
1
2
$ perl -c add.pl
add.pl syntax OK
As-tu changé quelque chose?

Il y avait cependant deux petites erreurs:

Code :
my ($fichier1, $fichier2) = qw / fichier1.txt fichier 2.txt/;
Enlever l'espace entre fichier et 2.txt

Code :
my ($fichier1, $fichier2) = qw / fichier1.txt fichier2.txt/;
Et corriger la ligne d'impression à la fin, remplacer $total_value par $total_val.:

Code :
print "$texte $tot_val\n";
Et là, ça imprime:

Code :
1
2
3
bonjour 2
les 5
Amis 9
Merci ça marche
__________________
Le jour est le père du labeur et la nuit est la mère des pensées.
étoile de mer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 13h25   #6
étoile de mer
Débutant
 
Avatar de étoile de mer
 
Étudiant
Inscription : avril 2007
Messages : 940
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2007
Messages : 940
Points : 72
Points : 72
Bonjour,
Je suis encore dans le meme contexte

J'ai un souci avec les valeur à virgule, jai un message d'erreur :

Use of uninitialized value $texte in concatenation (.) or string at ./perl.pl line 18, <$FIC2> line 1.
0
Use of uninitialized value $texte in concatenation (.) or string at ./perl.pl line 19, <$FIC2> line 1.



Merci d'avance
__________________
Le jour est le père du labeur et la nuit est la mère des pensées.
étoile de mer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 18h51   #7
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 567
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 567
Points : 1 117
Points : 1 117
Bonjour,

modifie la ligne 7 comme suit:

Code :
my ($texte, $value1) = ($1, $2) if $line1 =~ /^([\w\s]+)([,\d]+)$/;
Idem pour la ligne 10:

Code :
my $value2 = $1 if $line2 =~ /([,\d]+)$/;
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/12/2012, 19h08   #8
étoile de mer
Débutant
 
Avatar de étoile de mer
 
Étudiant
Inscription : avril 2007
Messages : 940
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2007
Messages : 940
Points : 72
Points : 72
Merci Lolo,
Avec ce code
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/perl 
use strict;
use warnings;
use feature qw(:5.10);
my ($fichier1, $fichier2) = qw / fichier1.txt fichier2.txt/;
 
open my $FIC1, "<", $fichier1, or die "impossible ouvrir $fichier1 $! \n";
open my $FIC2, "<", $fichier2, or die "impossible ouvrir $fichier2 $! \n";
open(FICHIERNOUVELLES, ">resultat.txt");
 
while (my $line1 = <$FIC1>) {
     chomp $line1;
     my ($texte, $value1) = ($1, $2) if $line1 =~ /^([\w\s]+)([.\d]+)$/;
     my $line2 = <$FIC2>;
     chomp $line2;
     my $value2 = $1 if $line2 =~ /([.\d]+)$/;
     my $tot_val = $value1 + $value2;
     print "$texte $tot_val\n";
     print FICHIERNOUVELLES "$texte $tot_val\n";
 
 
}
close FICHIERNOUVELLES;
close $FIC1;
close $FIC2;
fichier1 :
a a 4

fichier2:
a a 1.1

fichier resultat :
a a 1 4.1

ce qui est faux
__________________
Le jour est le père du labeur et la nuit est la mère des pensées.
étoile de mer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 23h37   #9
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 567
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 567
Points : 1 117
Points : 1 117
Hum, je viens d'essayer.

En imprimant les différentes variables, j'obtiens bien:
- $value1 = 4
- $value2 = 1.1
- $tot_val = 5.1

et 'print "$texte $tot_val\n";' m'affiche "a a 5.1".

Fais comme moi, affiche chacune des valeurs intermédiaires pour débuguer et essayer de trouver où se trouve l'erreur dans ton programme.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 19h58   #10
étoile de mer
Débutant
 
Avatar de étoile de mer
 
Étudiant
Inscription : avril 2007
Messages : 940
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2007
Messages : 940
Points : 72
Points : 72
Merci Lolo, j'ai essayé de faire des verification avec les affichage:
quand j'inverse le contenu des 2 fichier de cette sorte :
fichier1 :
a a 1.1

fichier2:
a a 4


ca m'affiche ca :

a a 4 1.1

avec value1 = .1

et value2 = 4
__________________
Le jour est le père du labeur et la nuit est la mère des pensées.
étoile de mer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 23h39   #11
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 567
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 567
Points : 1 117
Points : 1 117
Oui, si tu intervertis les deux fichiers, il y a un petit problème.

Et le problème est qu'il faut définir très précisément le motif que tu risques de rencontrer (combien de lettres, combien de chiffres, etc.

Si tu changes la ligne 13 du code que tu as posté en dernier avec ceci:

Code :
my ($texte, $value1) = ($1, $2) if $line1 =~ /^([a-zA-Z\s]+)([.\d]+)$/;
ça va marcher:

Mais ça veut dire que si ton fichier contient "a2 a 1.1" au lieu de "a a 1.1", ça ne marchera plus (le 2 ne sera plus reconnu).

Donc, encore une fois, la question est de définir très précisément les données en entrée.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/12/2012, 12h46   #12
étoile de mer
Débutant
 
Avatar de étoile de mer
 
Étudiant
Inscription : avril 2007
Messages : 940
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2007
Messages : 940
Points : 72
Points : 72
Merci Lolo87
__________________
Le jour est le père du labeur et la nuit est la mère des pensées.
étoile de mer est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h39.


 
 
 
 
Partenaires

Hébergement Web