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 :

Extraction des données


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Par défaut Extraction des données
    salut,
    je parcours un fichier, écrit de la manière suivante:

    PORTE a,b,c,d,e,f,g,
    h,i,j,k,


    je dois afficher:
    a PORTE
    b PORTE
    c PORTE
    d PORTE
    e PORTE
    f PORTE
    g PORTE
    ....

    comment je vais faire?
    merci

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par bezoindaidde
    salut,
    je parcours un fichier, écrit de la manière suivante:

    PORTE a,b,c,d,e,f,g,
    h,i,j,k,


    je dois afficher:
    a PORTE
    b PORTE
    c PORTE
    d PORTE
    e PORTE
    f PORTE
    g PORTE
    ....

    comment je vais faire?
    merci
    Bonne question ! Comment vas-tu faire ?

    Tu vas lire le fichier et le parser.

    Par exemple :
    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
    #!/usr/bin/env perl
    use strict; use warnings;
     
    my $filename = shift;
    open my($data_src), '<', $filename
      or die "Couldn't open $filename : $!\n";
     
    while( <$data_src> ){
      my( $nature, $list ) = m/^(\w+)\s+(.+)$/;
      my @list = split /,/, $list;
      print "$_ $nature\n" for @list;
    }
     
    close $data_src;
     
    __END__
    Ou quelque chose comme ça. (à vrai dire, s'il y a vraiment des sauts de ligne en plein dans ta liste comme dans ton exemple, ça va être un peu plus compliqué)

    --
    Jedaï

  3. #3
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Par défaut
    veux tu bien m'expliquer le code??
    g du mal à le comprendre le principe...c'est quoi shift, > ...etc?

  4. #4
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Par défaut
    my( $nature, $list ) = m/^(\w+)\s+(.+)$/; ????

    excuse moi, c'est que du perl ??

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    J'utilise un certain nombre d'idiômes dans mon script, néanmoins rien d'affolant. Par exemple quand tu vois une fonction que tu ne connais pas "shift" ici, tu devrais avoir le réflexe de regarder sa documentation (en tapant "perldoc -f shift" dans une console, ou en consultant le site perldoc, ou la traduction partielle en français). Tu as alors ta réponse (ou pas, selon ton expérience de programmateur...) :
    Retourne la première valeur d'un tableau après l'avoir supprimée du tableau en rétrécissant sa taille de 1 et en déplaçant tout vers le bas. Renvoie undef si il n'y a pas d'éléments dans le tableau. Si TABLEAU est omis, shift agira soit sur le tableau @_ s'il est dans la portée lexicale d'une subroutine ou d'un format, soit sur le tableau @ARGV s'il est dans la portée lexicale d'un fichier
    @ARGV est un nom très souvent utilisé (dans beaucoup de langages) pour le tableau des arguments de la ligne de commande. Autrement dit, mon "shift" ici récupère le premier argument de mon programme.

    Quant à tes autres questions, malheureusement "..." n'est pas suffisamment expressif pour que je comprenne ce qu'elles sont...


    Citation Envoyé par bezoindaidde
    my( $nature, $list ) = m/^(\w+)\s+(.+)$/; ????

    excuse moi, c'est que du perl ??
    Et bien dire qu'il ne s'agit que de Perl serait légèrement polémique : en effet la partie m/.../ est écrite dans le langage des regex (expressions régulières), qui permet de parser (c'est à dire décomposer en éléments lexicaux) facilement des expressions simples sous formes de chaînes de caractères. Les regex sont très utilisées en Perl car elles y sont très faciles d'emploi (bien plus que dans la plupart des langages qui permettent leur utilisation).

    Une version légèrement retouchée de mon script, avec commentaires à la clé :

    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
    #!/usr/bin/env perl
    use strict; use warnings;
     
    # récupérer le premier argument du script
    # on suppose qu'il s'agit du nom du fichier à traiter
    my $filename = $ARGV[0];
     
    # on ouvre le fichier en lecture ('<'), le handle de fichier est $data_src
    open my($data_src), '<', $filename
      or die "Couldn't open $filename : $!\n";
     
    # boucle de lecture, on lit ligne par ligne dans $line
    while( my $line = <$data_src> ){
      # on extrait "PORTE" dans $nature et la liste dans $list_string
      my( $nature, $list_string ) = ($line =~ m/^(\w+)\s+(.+)$/);
      # on découpe notre liste selon les virgules et on place ses éléments
      # dans le tableau @list
      my @list = split /,/, $list_string;
      # on itère sur les éléments de @list en les plaçant tour à tour dans $object
      for my $object ( @list ){
        # on fait l'affichage tel que tu l'as indiqué
        print "$object $nature\n";
      }
    }
     
    # on referme le fichier
    close $data_src;
     
    __END__
    Ca va mieux comme ça ? Néanmoins dis-toi bien qu'on ne prendra pas toujours le temps de te faire un joli code commenté de bout en bout comme celui-ci, il va falloir apprendre un peu les bases de la programmation en Perl pour pouvoir lire un code basique comme une ouverture de fichier suivi d'une lecture et décomposition avec regex, c'est le schéma de base de beaucoup de programmes après tout (Perl est très utilisé pour faire du traitement ou du filtrage de données, texte ou binaires).

    --
    Jedaï

  6. #6
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 52
    Par défaut
    merci pr l'effort !

Discussions similaires

  1. [RSS] extraction des données d'un flux
    Par toddy_101 dans le forum APIs
    Réponses: 4
    Dernier message: 23/02/2007, 17h28
  2. vc++(6)+extraction des données dans une image(.tif)
    Par spootnic22 dans le forum Visual C++
    Réponses: 1
    Dernier message: 22/11/2006, 16h14
  3. [MySQL] Problème de Charset à l'extraction des données
    Par naoufal01 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/11/2006, 13h14
  4. extraction des données dans une table Access
    Par moabomotal dans le forum Access
    Réponses: 2
    Dernier message: 26/05/2006, 11h17

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