IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

copie STDOUT de boucle dans fichier.txt


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut copie STDOUT de boucle dans fichier.txt
    Bonjour,

    je vous dérange après Noël car je bloque sur un sujet que je pense très bête.

    Pour un futur besoin, je dois lire un fichier CVS, récupérer la valeur de la première colonne (avec exception de la première ligne) qui me servira à nommer un fichier .txt.
    Dans ce fichier nominatif je veux voir le résultat de commandes.

    je souhaite voir les résultats s'afficher à l'écran (pour voir si il y a un problème déjà en phase de test) et également les enregistrer dans le fichier nominatif en tant que log.

    Deux tests qui ne me donnent pas les résultats escomptés.


    Fichier CSV

    Nom : CSV.png
Affichages : 136
Taille : 2,3 Ko


    1er test

    utilisation du module File::Tee

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    use strict;
    use warnings;
    use Data::Dumper;
    use feature 'say';
    no warnings 'uninitialized';
    use File::Tee qw(tee);
    use Spreadsheet::Read;
     
     
    my $book  = ReadData ("$ARGV[0]", sep => ";");
     
    my @rows = Spreadsheet::Read::rows($book->[1]);
    shift @rows;
     
     
    foreach my $row (@rows) {
        foreach my $cellule($row->[0]) {
    		tee(STDOUT, '>', "$cellule\.txt");
    		print "$cellule\n";
    		say "toto";
    		say "tata";
    		}
    	}

    Résultat

    $ perl test.pl CSV-PERL-TEST.csv
    172.20.98.3
    toto
    tata
    172.20.98.4
    toto
    tata
    Affiche les résultat de commandes, crée les fichier nominatifs
    172.20.98.3.txt
    172.20.98.4.txt

    mais le fichier 172.20.98.3.txt (la première ligne) contient toutes les valeurs des lignes suivantes du fichier CSV.
    $ more 172.20.98.3.txt
    172.20.98.3
    toto
    tata
    172.20.98.4
    toto
    tata
    2è test
    Utilisation des de filehandle


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    use strict;
    use warnings;
    use Data::Dumper;
    use feature 'say';
    no warnings 'uninitialized';
    use File::Tee qw(tee);
    use Spreadsheet::Read;
     
     
    my $book  = ReadData ("$ARGV[0]", sep => ";");
     
    my @rows = Spreadsheet::Read::rows($book->[1]);
    shift @rows;
     
    foreach my $row (@rows) {
    foreach my $cellule($row->[0]) {
    open (my $fh, '>', "$cellule\.txt") or die "Could not open file $!";;
    print $fh "$cellule\n";
    say $fh "toto";
    say $fh "tata";
    		}
    	}

    Résultat
    $ perl test.pl CSV-PERL-TEST.csv
    Plus de lecture en STDOUT

    Les fichiers sont bien crée nominativements et le résultat est celui recherché.
    172.20.98.3.txt
    172.20.98.4.txt

    $ more 172.20.98.3.txt
    172.20.98.3
    toto
    tata


    La première solution me semblait la plus simple avec une copie du STDOUT dans une boucle.

    Quelqu'un à déjà été confronté à ce problème ?

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    je ne suis pas sûr du fonctionnement de tee avec un fichier différent à chaque ligne. Il faudrait tester en détail, mais, dans le doute, une solution de rechange possible pourrait être d'écrire une fonction d'impression spécifique, quelque chose de ce genre (pas testé):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sub my_say {
        my $fh = shift;
        for my $item (@_) {
            say $item;
            say $fh $item;
        }
    }

    Ensuite, quelque chose comme ceci dans le code appelant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach my $row (@rows) {
        foreach my $cellule($row->[0]) {
            open my $fh, '>', "${cellule}.txt" or die "Could not open file $cellule.txt $!";
            my_say($cellule, "toto", "tata");
            close $fh;
        }
    }

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut
    Bonjour Lolo !

    j'ai essayé le code suivant ton conseil

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    26
    27
    28
    use strict;
    use warnings;
    use Data::Dumper;
    use feature 'say';
    no warnings 'uninitialized';
    use Spreadsheet::Read;
     
    my $book  = ReadData ("$ARGV[0]", sep => ";");
     
    my @rows = Spreadsheet::Read::rows($book->[1]);
     
    shift @rows;
     
    sub my_say {
        my $fh = shift;
        for my $item (@_) {
            say $item;
            say $fh $item;
        }
    }
     
    foreach my $row (@rows) {
        foreach my $cellule($row->[0]) {
            open my $fh, '>', "${cellule}.txt" or die "Could not open file $cellule.txt $!";
            my_say($cellule, "toto", "tata");
            close $fh;
        }
    }
    j'ai le message d'erreur suivant

    $ perl test.pl CSV-PERL-TEST.csv
    toto
    Can't use string ("172.20.98.3") as a symbol ref while "strict refs" in use at test.pl line 18.
    qui correspond à la ligne

    Je me demandais, les crochets que tu as rajouté sur le nom du fichier crée ont une importance particulière par rapport à ce que j'avais mis ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open my $fh, '>', "${cellule}.txt" or die "Could not open file $cellule.txt $!";
    Merci.

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    oups, une erreur (premier paramètre manquant) dans le code appelant: remplace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my_say($cellule, "toto", "tata");
    par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my_say($fh, $cellule, "toto", "tata");

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut
    Nickel ca fonctionne

    J'ai une question plus globale.

    Qu'est ca apporte d'utiliser une subroutine crée quelque part dans le script, au lieu de mettre les lignes dans une boucle?
    Je vois de temps de temps et ca oblige à aller chercher les commandes ailleurs et de faire des aller retour dans le fichier.

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Ça permet d'éviter de répéter plusieurs fois les deux lignes d'impression (une fois dans le fichier, une fois sur la sortie standard). Pour éviter d'avoir à écrire quelque chose de ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    print $fh "$cellule\n";
    print "$cellule\n";
    say $fh "toto";
    say "toto";
    say $fh "tata";
    say "tata";
    Plus généralement, encapsuler les fonctionnalités d'impression dans une fonction séparée permet de ne plus avoir à s'occuper ailleurs de ces détails et de mieux se concentrer sur le reste.

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut
    Effectivement, je m'en souviendrais pour les prochaines fois :-)

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Cela facilite aussi la maintenance : s'il faut modifier l'impression, on ne le fait qu'à un seul endroit, ce qui évite d'oublier de le faire partout.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

Discussions similaires

  1. [XL-2010] Copie d'une colonne entièere dans fichier.txt
    Par r4v3n dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/11/2015, 10h13
  2. lire données dans fichier txt
    Par flo456 dans le forum Langage
    Réponses: 5
    Dernier message: 14/09/2006, 08h01
  3. prb retour a la ligne dans fichier txt telecharge avec php
    Par supersonicblonde dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2006, 14h20
  4. Réponses: 1
    Dernier message: 05/05/2006, 10h36
  5. Donnee excel pour requete sql dans fichier txt ou doc
    Par Yogi_01 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/04/2006, 10h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo