Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Débutant Avatar de étoile de mer
    Étudiant
    Inscrit en
    avril 2007
    Messages
    954
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2007
    Messages : 954
    Points : 81
    Points
    81

    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.

  2. #2
    Expert Confirmé

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 318
    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 : 1 318
    Points : 2 910
    Points
    2 910

    Par défaut

    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.
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  3. #3
    Débutant Avatar de étoile de mer
    Étudiant
    Inscrit en
    avril 2007
    Messages
    954
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2007
    Messages : 954
    Points : 81
    Points
    81

    Par défaut

    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.

  4. #4
    Expert Confirmé

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 318
    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 : 1 318
    Points : 2 910
    Points
    2 910

    Par défaut

    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
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  5. #5
    Débutant Avatar de étoile de mer
    Étudiant
    Inscrit en
    avril 2007
    Messages
    954
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2007
    Messages : 954
    Points : 81
    Points
    81

    Par défaut

    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.

  6. #6
    Débutant Avatar de étoile de mer
    Étudiant
    Inscrit en
    avril 2007
    Messages
    954
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2007
    Messages : 954
    Points : 81
    Points
    81

    Par défaut

    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.

  7. #7
    Expert Confirmé

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 318
    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 : 1 318
    Points : 2 910
    Points
    2 910

    Par défaut

    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]+)$/;
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  8. #8
    Débutant Avatar de étoile de mer
    Étudiant
    Inscrit en
    avril 2007
    Messages
    954
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2007
    Messages : 954
    Points : 81
    Points
    81

    Par défaut

    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.

  9. #9
    Expert Confirmé

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 318
    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 : 1 318
    Points : 2 910
    Points
    2 910

    Par défaut

    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.
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  10. #10
    Débutant Avatar de étoile de mer
    Étudiant
    Inscrit en
    avril 2007
    Messages
    954
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2007
    Messages : 954
    Points : 81
    Points
    81

    Par défaut

    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.

  11. #11
    Expert Confirmé

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 318
    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 : 1 318
    Points : 2 910
    Points
    2 910

    Par défaut

    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.
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  12. #12
    Débutant Avatar de étoile de mer
    Étudiant
    Inscrit en
    avril 2007
    Messages
    954
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2007
    Messages : 954
    Points : 81
    Points
    81

    Par défaut

    Merci Lolo87
    Le jour est le père du labeur et la nuit est la mère des pensées.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •