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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 : 59
    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
    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.

  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
    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
    Membre confirmé
    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
    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
    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
    Membre confirmé
    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
    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

+ 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, 09h43
  2. [c#] Simplification de code
    Par Revan012 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/02/2006, 16h44
  3. Réponses: 1
    Dernier message: 29/11/2005, 22h05
  4. [langage] code Perl
    Par GMI3 dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2004, 11h26

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