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 :

Simplification de code perl


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut Simplification de code perl
    Bonjour à tous,

    Est-il possible de simplier ce code ?

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    use strict;
    use warnings;
     
    my $param_facture = "param_facture.txt";
    open my $PARAM, ">", "$param_facture" or die "Ouverture impossible de $param_facture $!"; 
     
    my $phrase = "2		Le nom de votre société  : LGM  ";
    my $phrase1 = "3                                                   F A C T U R E n°15428 ";
    my $phrase2 = "11                                               Société  et/ou  Nom  du  client : TGPLUS ";
    my $phrase3 = "22	N°client     : 7895123 ";
     
    my $phrase4 = "2 Le nom de votre société  : Bidule ";
    my $phrase5 = "3                                                    F A C T U R E n°25846 ";
    my $phrase6 = "11                                                  Société  et/ou  Nom  du  client : ARL";
    my $phrase7 = "22 N°client     : 1862986 ";
     
    my $phrase8 = "2 Le nom de votre société  : LP";
    my $phrase9 = "3                                                   F A C T U R E n°15427 ";
    my $phrase10 = "11                                              Société  et/ou  Nom  du  client : ARI";
    my $phrase11 = "22 N°client     : 7458123";
     
    my $phrase12 = "2 Le nom de votre société  : Core";
    my $phrase13 = "3                                                  F A C T U R E n°28446 ";
    my $phrase14 = "11                                                  Société et/ou Nom du client : SIO ";
    my $phrase15 = "22 N°client     : 18751686";
     
    my $line1 = substr $phrase,0,1;
    my $char1 = substr $phrase, 32,3;
    my $line2 = substr $phrase1,0,1;
    my $char2 = substr $phrase1,68,8;
    my $line3 = substr $phrase2,0,2;
    my $char3 = substr $phrase2, 85,6;
    my $line4 = substr $phrase3,0,2;
    my $char4 = substr $phrase3, 19, 7;
     
    my $line5 = substr $phrase4,0,1;
    my $char5 = substr $phrase4,31,6;
    my $line6 = substr $phrase5,0,1;
    my $char6 = substr $phrase5,69,8;
    my $line7 = substr $phrase6,0,2;
    my $char7= substr $phrase6,88,3;
    my $line8 = substr $phrase7,0,2;
    my $char8 = substr $phrase7,19,7;
     
    my $line9 = substr $phrase8,0,1;
    my $char9 = substr $phrase8,31,6;
    my $line10 = substr $phrase9,0,1;
    my $char10 = substr $phrase9,68,8;
    my $line11 = substr $phrase10,0,2;
    my $char11 = substr $phrase10,84,3;
    my $line12 = substr $phrase11,0,2;
    my $char12 = substr $phrase11,19,7;
     
    my $line13 = substr $phrase12,0,1;
    my $char13 = substr $phrase12,31,6;
    my $line14 = substr $phrase13,0,1;
    my $char14 = substr $phrase13,67,8;
    my $line15 = substr $phrase14,0,2;
    my $char15 = substr $phrase14,84,3;
    my $line16 = substr $phrase15,0,2;
    my $char16 = substr $phrase15,19,7;
     
    print $PARAM "$line1;$char1;$line2;n$char2;$line3;$char3;$line4;$char4
    			\n$line5;$char5;$line6;n$char6;$line7;$char7;$line8;$char8
    			\n$line9;$char9;$line10;n$char10;$line11;$char11;$line12;$char12 
    			\n$line13;$char13;$line14;n$char14;$line15;$char15;$line16;$char16\n";
     
    close $PARAM;
    Cordialement

  2. #2
    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
    Je ne sais pas s'il faut parler de "simplification" ou plutôt de "robustesse". Récupérer des "champs" dans une ligne de texte avec des "substr" utilisant des constantes numérique de position et de taille n'est pas très robuste.

    Pour remplacer par exemple les affectations de $line1 et $char1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($line1, $char1) = $phrase =~ /^(\d+).*?:\s*(.*)\s*$/;
    Après, pour extraire les champs avec une regexp, il faut connaitre précisément le format du texte (moins on le connais, plus la regexp risque de ne pas extraire les bonnes informations).

    Pour récupérer un nombre en tête de chaine, il suffit par exemple de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($line_nb) = $text =~ /^(\d+)/;
    My 2 cents.
    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

  3. #3
    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,

    je ne comprends pas très bien, car cela ne correspond plus du tout aux questions que tu avais posées antérieurement sur des données très similaires, et encore moins aux pistes ou solutions que l'on t'avait proposées. L'objectif du fichier de param était de dire un truc du genre: dans un fichier en entrée, si je suis à la ligne 7, j’extrais le champ qui commence en position 37 et mesure 5 caractères (par exemple). Ici, ça n'a plus rien à voir.

    Et je ne vois pas du tout l'utilité de ce code: quitte à tout coder en dur comme tu le fais ici dans les lignes 5 à 62, tu peux aussi bien imprimer directement le résultat final codé en dur dans une chaîne de caractères en ligne 64 et suivantes.

    Sinon, quand je vois des variables numérotées dans un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $phrase = "2		Le nom de votre société  : LGM  ";
    my $phrase1 = "3                                                   F A C T U R E n°15428 ";
    my $phrase2 = "11                                               Société  et/ou  Nom  du  client : TGPLUS ";
    ...
    je me dis tout de suite qu'il faudrait sans doute utiliser un tableau @phrase, avec des indices de 0 à 15, même chose pour les variables line1, line2, ... et char1, char2, ....

    Ensuite, je m'arrangerais aussi pour éviter d'avoir un décalage entre les numéros. Par exemple, dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $line2 = substr $phrase1,0,1;
    my $char2 = substr $phrase1,68,8;
    les numéros entre les expressions de gauche et de droite coïncideraient tout du long si la numérotation de $lineX et $charX commençait à 0 au lieu de 1 (ou si celle de phrase commençait à 1). Ce qui donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $line2 = substr $phrase2, 0, 1;
    my $char2 = substr $phrase2, 68 ,8;
    Cela éviterait beaucoup de sources d'erreurs.

    Pour revenir à l'idée d'utiliser des tableaux, si @phrase est un tableau commençant à l'indice 0, l'alimentation du tableau @char peut se faire automatiquement dans une boucle du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for my $i (0..15) {
        my ($number) = $phrase[$i] =~ /^\d+/;
         $char[$i] = $number;
    }
    Il y a même certainement plus simple encore, mais comme je ne comprends même pas le vrai but de ce code, ainsi que je l'ai dit au début, je ne peux pas simplifier plus sans faire des hypothèses peut-être trop audacieuses sur ce but.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Bonjour à tous,

    Ce que j’ai :
    J’ai un programme qui envoie toute les valeurs que je souhaite vers le fichier paramètre
    J’ai un fichier paramètre qui contient les valeurs qui se trouvent dans le programme
    Le programme est celui de cette discussion

    Ce que je veux :
    Le fichier paramètre contient les informations d’un fichier type facture. Comme on ne connaît pas le nombre de facture on souhaite rajouter les lignes dans le fichier paramètre au fur et à mesure sans modifier le programme.

  5. #5
    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
    Mais ton fichier paramètre est censé décrire une seule facture de façon à paramétrer ton extraction. Ensuite tu boucles sur tes factures. Si tu créer un fichier paramètre ayant des enregistrements pour chaque facture, ça n'a plus aucun sens.

    Etape 1: écrire manuellement un fichier paramètre qui décrit une (seule) facture-type (du genre, dans une facture, le numéro de client est sur le 7ème ligne en position 20 à 30).

    Etape 2 : lire le fichier de paramètre une seule fois pour savoir ce que l'on a besoin d'extraire en stockant par exemple dans un hachage les numéros de lignes et positions dans la facture.

    Etape 3: boucler sur chaque facture pour extraire les données en utilisant le hachage alimenté précédemment.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    Comment utiliser correctement les tables de hachages pour générer un programme depuis un fichier?
    Est-ce possible ?

    Parce que je ne veux pas que les valeurs soit écrite en dur dans le programme voici mon programme :

    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
    37
    38
    39
    40
    41
    42
    43
    44
     
    use strict;
    use warnings;
     
    sub GetFilesList
    {
            my $Path = $_[0];
            my $FileFound;
            my @FilesList=();
     
            # Lecture de la liste des fichiers
            opendir (my $FhRep, $Path)
                    or die "Impossible d'ouvrir le repertoire $Path\n";
            my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
            closedir ($FhRep);
     
            foreach my $FileFound (@Contenu) {
                    # Traitement des fichiers
                    if ( -f "$Path/$FileFound") {
                            push ( @FilesList, "$Path/$FileFound" );
                    }
                    # Traitement des repertoires
                    elsif ( -d "$Path/$FileFound") {
                            # Boucle pour lancer la recherche en mode recursif
                            push (@FilesList, GetFilesList("$Path/$FileFound") );
                    }
     
            }
            return @FilesList;
    }
    my @Files = GetFilesList ('C:/Users/baranowp/Documents/2016_01_07_08/facture/');
    foreach my $File  (@Files) { 
    	next unless $File =~ /\.txt$/i;
    	print "$File \n";
    }
    my %h = ("2" => "LGM",
    		 "3" => "n°15428",
    		 "11" => "TGPLUS",
    		 "22" => "7895123"); 
     
    my @t = keys (%h);
    foreach my $k (keys(%h)){
    	print "Clef=$k Valeur=$h{$k}\n";
    }
    Cordialement

  7. #7
    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
    Citation Envoyé par solerian Voir le message
    Comment utiliser correctement les tables de hachages pour générer un programme depuis un fichier?
    Générer un programme depuis un fichier? DSL, je ne comprends pas ce que tu veux faire. Peux-tu expliquer?

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    Ce que je souhaite faire c'est modifié mon fichier texte sans modifier mon programme il faut qu'il se modifie automatiquement. Parce que je ne sais pas combien j'aurais de fichier facture. Je ne veux pas modifier le programme manuellement.

  9. #9
    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
    Mais l'idée est que ton fichier texte soit générique pour une seul facture. IL décrit simplement, pour une facture (une seule), l'endroit où les données doivent être récupérées dans une facture. Rien de plus.

    Ensuite, tu lis ton fichier texte en début de traitement afin de paramétrer ton extraction et ton programme boucle sur toutes les factures présentes en utilisant, pour chacune d'elles, le paramétrage lu au début dans ce fichier texte.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    J'ai trouvé la solution en utilisant un tableau afin de parcourir le fichier paramètre et d'extraire les différentes informations

    Merci beaucoup pour votre aide.

    Cordialement

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

Discussions similaires

  1. pb code perl
    Par visteur dans le forum Langage
    Réponses: 3
    Dernier message: 06/03/2006, 10h43
  2. [c#] Simplification de code
    Par Revan012 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/02/2006, 17h44
  3. Réponses: 1
    Dernier message: 29/11/2005, 23h05
  4. [langage] code Perl
    Par GMI3 dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2004, 12h26

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