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 :

La fonction substr


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 La fonction substr
    Bonjour,

    La fonction substr peut-elle être utilisée pour les fichiers ?

    J'ai réussi à l'utiiser pour des phrases mais les phrases que j'ai choisit son dans un fichier or je souhaite également récupérer le numéro de ligne

    Voici mon 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
     
    use strict;
    use warnings;
     
    my $phrase = "Le nom de votre société  : LGM  ";
    my $phrase1 = "                                                    F A C T U R E n°15428 ";
    my $phrase2 = "                                               Société  et/ou  Nom  du  client : TGPLUS ";
    my $phrase3 = "N°client     : 7895123 ";
     
    my $char = substr $phrase, 29,3;
    my $char2 = substr $phrase1, -6,6;
    my $char3 = substr $phrase2, -7,6;
    my $char4 = substr $phrase3, 16, 7;
    print "Société: $char\nFacture: n°$char2\nClient : $char3\nN°Client: $char4\n ";
    Voici le résultat :Pièce jointe 199367

    Le résultat me permet ainsi de générer mon fichier de paramètre qui a la forme suivante :
    num_ligne; position; nombre de caractère; le nom du champ
    num_ligne; 29; 3; nom de la société
    num_ligne; -6; 6; numéro de facture
    num_ligne ; -7;6; nom du client
    num_ligne ; 16; 7; numéro de client

    Le fichier utiliser et toujours le même que d'habitude qui est situé dans les anciennes discussions que j'ai crée en l'occurence ici le nom du fichier est : facture.txt

    Cordialement

  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
    Il faut que tu commences par lire le fichier de config, par exemple un CSV, de façon à stocker en mémoire des variables indiquant un truc du genre: dans la ligne numéro 2, je veux récupérer les caractères 17 à 22, et pareil pour les autres lignes. En fait, plutôt que des variables, j'utiliserais un hachage de hachages (ou tableau de hachages), dont la clé de premier niveau est la ligne qui m'intéresse et le hachage imbriqué pointe vers la position du caractère de début et la longueur de la chaîne à récupérer.

    Par exemple, si j'ai un CSV constitué ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    num_ligne;item;début;longueur;...
    4;cli;10;5;...
    5;fact;20;3;...
    ...
    Ce CSV dit par exemple que la ligne 4 contient le numéro de client, et que ce numéro commence au caractère 10 et a une longueur de 5 caractères.

    Je commence par lire ce fichier de configuration une seule fois pour alimenter le hachage de configuration;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    my %hash;
    while (<$CONFIG>) {
        next unless /^\d/; # si la ligne ne commence pas par un chiffre, c'est l'entête, je saute la ligne
        chomp;
        my ($num_ligne, $item, $debut, $longueur, ...) = split /;/, $_;
        $hash{$num_ligne}{item} = $item;
        $hash{$num_ligne}{start} = $debut;
        $hash{$num_ligne}{length} = $longueur;
        # idem pour autres champs
    }
    close $CONFIG;
    Ensuite, je lis une de mes factures:
    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
     
    my ($num_cli, $num_fact, ...);
    while (<$FACT>) {
        next unless defined $hash{$.}; # passe cette ligne si elle ne contient aucun des éléments qui m'intéresse
        my $debut = $hash{$.}{start};
        my $longueur = $hash{$.}{length};
        my $var = substr $_, $debut, $length;
        if ($hash{$.}{item} = "cli") {
            $num_cli = $var;
        } elsif ($hash{$.} = "fact") {
            $num_fact = $var;
        } elsif ( ...) {
            # ...
        }
    }
    print "La facture numéro $num_fact au client $num_cli est d'un montant de ... \n";
    Ce code n'est pas testé, il se peut qu'il y ait une petite erreur ici ou là, mais ça donne l'idée de la mécanique à employer.

    En fait, on pourrait faire un peu plus propre (pas de comparaison codée en dur entre $hash{$.}{item} et "cli" ou "fact") et plus court (sans une partie au moins ces variables intermédiaires), mais j'ai préféré décomposer et détailler les étapes logiques.

    J'espère que ça te donne un bon point de départ pour démarrer et tous les éléments pour arriver au bout.

    A noter que si plusieurs éléments à récupérer peuvent se retrouver sur la même ligne, des modifications seront à apporter à la logique de fonctionnement.

  3. #3
    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
    Est ce que la fonction substr peut prendre en compte plusieurs information dans une variable par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $phrase = "2     Le nom de votre société  : LGM  ";
    my $char1 = substr $phrase, 1, 1 - 29,3;
    Ou faut il faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $phrase = "2		Le nom de votre société  : LGM  ";
    my $char1 = substr $phrase, 1, 1;
    my $char = substr $phrase, 29,3;
    Cordialement

  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
    Il faut deux appels successifs, un pour chaque sous-chaîne à récupérer.

  5. #5
    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
    C'est que j'ai fait, sa fonctionne.

    Maintenant je souhaite envoyé ces valeurs dans un fichiers texte comment faire ?

    Je souhaite que le résultat qui est renvoyé dans la console soit envoyer vers un fichier.txt. Est-ce possible?

    Sacahnt que dans le fichier il doit y avoir:
    Le numéro de ligne; la position; le nombre de caractère et le nom du champ
    Exemple :
    2;32;3; le nom de la société

    Cordialement

  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
    Pour imprimer à l'écran:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "hello world!";
    Pour imprimer dans un fichier dont le filehandle est $OUT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print $OUT "hello world!";
    Et pour ouvrir préalablement ce fichier (une seule fois):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $output = "output.txt";
    open my $OUT, ">", "$output" of die "Ouverture impossible de $output $!";
    Et à la fin, pour le fermer:

  7. #7
    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
    Merci pour ton aide mon programme fonctionne correctement

    Cordialement

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

Discussions similaires

  1. [Dates] "concaténation" de fonction substr et autres
    Par javaboy dans le forum Langage
    Réponses: 12
    Dernier message: 12/04/2007, 10h51
  2. Limite de la fonction substr
    Par zimotep dans le forum Langage
    Réponses: 2
    Dernier message: 31/10/2006, 01h45
  3. [XSL]appliquer la fonction substring sur une valeur récupéré
    Par totoranky dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 22/02/2006, 17h21
  4. Doublons et fonction substring-before
    Par dalefou dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 30/09/2005, 14h12
  5. Réponses: 5
    Dernier message: 13/07/2005, 10h03

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