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 :

conseil pour un script perl


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut conseil pour un script perl
    bonjour
    CLASS CL-10A-BDD *NULL* 0 701000 0 *NULL*
    NAMES
    INFO 0 0 0 0 *NULL* 0 0 2147483647 1 0 0 0 0 0 0 0 0 0 1321436181 716AF15E103611E194170021284F59EA 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 3 9969
    KEY *NULL*
    BCMD *NULL*
    RCMD *NULL*
    RES VSU-op10aws01-P2A *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    POOL DDR-B-P2A-R3 NetBackup NetBackup NetBackup NetBackup NetBackup NetBackup NetBackup NetBackup NetBackup
    FOE 0 0 0 0 0 0 0 0 0 0
    SHAREGROUP *ANY*
    DATACLASSIFICATION *NULL*
    CLIENT op10aws01-adm Linux RedHat2.6 0 0 0 0 *NULL*
    INCLUDE /oradata/P10AAND/adm
    INCLUDE /oradata/P10AAND/u01
    INCLUDE /oradata/P10AAND/u02
    INCLUDE /oradata/P10AAND/u03
    INCLUDE /oradata/P10AAND/u04
    INCLUDE /oradata/P10AAND/u05
    INCLUDE /oradata/P10AAND/e01
    SCHED SCH-10A-BDD-FR3 0 1 604800 3 0 0 0 *NULL* 0 0 0 0 0 0 -1 0
    SCHEDWIN 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    SCHEDRES *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    SCHEDPOOL *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    SCHEDRL 3 1 1 1 1 1 1 1 1 1
    SCHEDFOE 0 0 0 0 0 0 0 0 0 0
    SCHEDSG *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    SCHED SCH-10A-BDD-FR1 0 1 604800 1 0 0 0 *NULL* 0 0 0 0 0 0 -1 0
    SCHEDWIN 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    SCHEDRES *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    SCHEDPOOL DDR-B-P2A-R1 *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    SCHEDRL 1 1 1 1 1 1 1 1 1 1
    SCHEDFOE 0 0 0 0 0 0 0 0 0 0
    SCHEDSG *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL* *NULL*
    Et à partir de là je dois générer cela
    CL-10A-BDD;SCH-10A-BDD-FR3;DDR-B-P2A-R3;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    CL-10A-BDD;SCH-10A-BDD-FR1;DDR-B-P2A-R1;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    je serais d'avis de partir avec un
    SWITCH:
    et de tester le 1er champ.
    Si j'ai le mot CLASS je récupère le champ suivant et cela correspond à ma clé
    Si j'ai le mot POOL je récupère le champ suivant etc etc
    Est-ce que cette façon de faire est correcte?
    D'avance 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
    Billets dans le blog
    1
    Par défaut
    Aucune idée si tu ne précises pas quelles sont les règles qui te permettent de passer de tes données en entrée à tes donnés en sortie.

  3. #3
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    Pour information
    Le fichier en entrée est généré avant le lancement du script.
    l'ordre des lignes est identique à ce que j'ai déjà envoyé.
    Sinon, voici une partie de mes reflexions
    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
    29
    30
    31
    32
    33
    34
    35
    36
    #!/usr/bin/perl
    use strict;
     
    my $fic1="fichier_en_entreel";
    my $fic2_out="fichier_en_sortie";
    my $police;
    my $volpool;
    my $include;
    my $schedule;
     
    open (fic1,'<',$fic1) or die "impossible d'ouvrir $fic1\n";
    while (<fic1>)
          {
            my $line=$_;
            my @infolist=split;
            SWITCH :{
               if ( $line =~ /^CLASS/ ) {
               $police = $infolist[1];
               last SWITCH;
               }
               if ( $line =~ /^POOL/ ) {
               $volpool = $infolist[1];
               last SWITCH;
               }
               if ( $line =~ /INCLUDE/ ) {
               $include = $infolist[1];
               last SWITCH;
               }
               if ( $line = /^SCHED/ ) {
               $schedule = $infolist[1];
               last SWITCH;
               }
            }
    print " police $police volume pool $volpool schedule $schedule repertoire $include trouvee dans le fichier $fic1\n" ;
    }
    close $fic1;

  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
    Billets dans le blog
    1
    Par défaut
    Eh bien, si ça marche, pourquoi pas? Mais j'ai un doute...

    Pour commencer, j'enlèverai ton étiquette SWITCH, qui ne sert à rien. Quelque chose comme cela serait plus clair à mon avis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while (<fic1>)
          {
            my @infolist=split;
            if ( /^CLASS/ ) {
               $police = $infolist[1];
               next;
            }
            if ( $line =~ /^POOL/ ) {
               $volpool = $infolist[1];
               next;
             }
             # ...
    Ou même ceci:

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $fic1="fichier_en_entreel";
    my $fic2_out="fichier_en_sortie";
    my ($police, $volpool, $include, $schedule);
    while (<fic1>) {
         my @infolist=split;
         $police = $infolist[1] and next if /^CLASS/;
         $volpool = $infolist[1] and next if /^POOL/;
         $include = $infolist[1] and next if /^INCLUDE/;
         if (/^SCHEDULE/) {
               $schedule = $infolist[1];
               print ...
         }
    }
    N'oublie pas d'ajouter le 'use warnings;', ça te fera gagner du temps pour repérer certains bugs.

    Cela dit, le principal problème de ton code est l'endroit (ou le moment) où tu fais ton print. Je ne suis pas sûr que ça fasse ce que tu désires. Mais comme tu n'as toujours pas expliqué ce que tu veux, je n'en sais trop rien...

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    Bonjour
    Merci à @Lolo78 pour ton aide.
    Comme je disais dans mon premier message c'est la ligne qui commence par le mot CLASS qui détermine le début de chaque enregistrement.

  6. #6
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Par défaut
    J'ai un probleme sur le script.
    En effet au niveau du résultat, les informations sont décalées.
    police AHI volume pool schedule repertoire trouvee dans le fichier /home/infsvg/log/bpplist_all
    police CL-02G-APPLI volume pool DDR-B-P1A-R1 schedule test repertoire /images trouvee dans le fichier /home/infsvg/log/bpplist_all
    Pour la deuxième ligne, le nom de police est bonne mais j'ai les informations qui devrait apparaitre dans la première ligne.
    Voici le script utilisé
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $fic1="fichier_en_entre";
    my $fic2_out="fichier_en_sortie";
    my ($police, $volpool, $include, $schedule);
     
    open (fic1,'<',$fic1) or die "impossible d'ouvrir $fic1\n";
    while (<fic1>)
          {
            my @infolist=split;
               $schedule = $infolist[1] and next if /^SCHED /;
               $volpool = $infolist[1] and next if /^POOL/;;
               $include = $infolist[1] and next if /^INCLUDE/;
               if ( /^CLASS / ) {
               $police = $infolist[1];
               print " police $police volume pool $volpool schedule $schedule repertoire $include trouvee dans le fichier $fic1\n" ;
               }
           }
    close $fic1;

  7. #7
    Membre chevronné Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Par défaut
    Intéressant. Si je comprends bien, on ne s'intéresse qu'à la première valeur suivant chaque clé, certaines clés (INCLUDE) ont plusieurs valeurs, il n'y a qu'un SCHEDPOOL par SCHED, et on peut générer une ligne de sortie dès qu'on a lu SCHEDPOOL. La petite difficulté consiste à utiliser la valeur de POOL lorsque SCHEDPOOL est *NULL*.

    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
    Taisha:~/tttmp $ cat xtract.pl
    use strict;
    use warnings;
    use feature 'say';
     
    my %h;
    while (<>) {
        chomp;
        my ($key, $first) = split;
        %h = () if $key eq 'CLASS';
        push @{$h{$key}}, $first;
        if ($key eq 'SCHEDPOOL') {
    	$_ eq '*NULL*' and $_ = $h{POOL}[0] for $h{SCHEDPOOL}[0];
    	say join ';', map { @$_ } @h{qw(CLASS SCHED SCHEDPOOL INCLUDE)};
    	pop @{$h{$_}} for qw(SCHED SCHEDPOOL);
        }	    
    }
    Taisha:~/tttmp $ perl xtract.pl datafile
    CL-10A-BDD;SCH-10A-BDD-FR3;DDR-B-P2A-R3;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    CL-10A-BDD;SCH-10A-BDD-FR1;DDR-B-P2A-R1;/oradata/P10AAND/adm;/oradata/P10AAND/u01;/oradata/P10AAND/u02;/oradata/P10AAND/u03;/oradata/P10AAND/u04;/oradata/P10AAND/u05;/oradata/P10AAND/e01
    Taisha:~/tttmp $ perl xtract.pl datafile | diff -b - expected
    Taisha:~/tttmp $
    Le programme ci-dessus supporte plusieurs CLASS dans le fichier d'entrée (ou bien, de manière équivalente, plusieurs fichiers passés en paramètre sur la ligne de commande).

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

Discussions similaires

  1. Conseil pour un script de suppression de fichiers en double
    Par doc malkovich dans le forum Langage
    Réponses: 10
    Dernier message: 11/09/2013, 11h17
  2. Réponses: 1
    Dernier message: 29/05/2008, 14h16
  3. Besoin de quelques conseils pour un script java
    Par poussin544 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 02/03/2006, 10h41
  4. Réponses: 2
    Dernier message: 11/07/2002, 08h31
  5. [web] Cherche un conseil pour un livre perl-tk
    Par Anonymous dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 29/04/2002, 15h35

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