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 :

[Problème] lecture fichier entre ; et :


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut [Problème] FichierTXT->Tableauxperl
    Bonjour à tous,

    voici mon fichier .txt (peut être modifiable)
    2 A:Biologie;EPS;Francais;Hist-géo;Informatique
    2 B:Biologie;EPS;Francais;Hist-géo;Informatique
    1 A:Biologie;EPS;philosophie;Hist-géo
    1 B:Biologie;EPS;philosophie
    T A:EPS;Hist-géo
    T B:EPS;Hist-géo;francais
    Ensuite j'ai une liste élèves avec leur classe
    Je recherche comment effectuer le code qui affiche les élèves celon leurs classe en affichant dans des valeurs differentes les matiéres

    exemple:
    "nomélève1" de 2 A assite aux cours de Biologie, EPS, Francais, Hist-géo et Informatique
    que chaque matiére soit dans un valeur distinc comme un tableau dans une boucle

    Merci d'avance de votre aide,
    Cordialement,
    Maloute."
      0  0

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    1) tu ouvres le fichier
    2) tu le lis ligne par ligne
    3) tu fais un @tab = split(";", $ligne)
    4) ton $tab[0] = 1 A:Biologie
    ton $tab[1] = EPS
    la suite du tableau sera tes noms de cours
    5) utilise les expressions régulières sur $tab[0] afin de scinder 1A et Biologie

    N'hésite pas à poser des questions,


    Jasmine,
    -- Jasmine --
      0  0

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    Comme ceci pour commencer? ou pas du tout !!

    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
     
    #!/usr/bin/perl
     
    #@lignes = ("");
     
    open(DAT, "<liste.txt") || die "fichier non trouvé\n";
    while(<DAT>)
     {
    #  push(@lignes,$_);
      @tab=split(";",$ligne)
     }
    close(DAT);
     
     
    #for(@lignes)
    # {
    #    print $_;
    # }
    d'avance merci.
      0  0

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Hello,

    si tu utilisais "use strict" dans ton code, je pense que ça t'aiderais beaucoup parce que là, le code que je lis, ça m'étonnerait qu'il fonctionne. Ou peut être que si, mais sans faire véritablement ce que tu lui demandes.

    A quoi correspond $ligne dans ton code et où est-il déclaré ?
      0  0

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Je pensais plutôt à :

    1) ouvrir fichier
    2) tant que ligne = fichier (boucle et lecture ligne par ligne)
    split (";", ligne)
    récupérer les informations
    écrire les informations relatives à cette ligne avant de traiter la suivante
    3) fermer le fichier


    Jasmine,
    -- Jasmine --
      0  0

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    Bonjour Arioch et oui encore moi,

    Je cherche comment faire un programme "j'ai le produit de départ
    et le final mais je cherche le coup de pouce pour le traitement du produit" pour résumé et simplifié ce que je viens de dire le code que j'ai mit et juste une ébauche à refaire completement, c'était juste pour me mettre sur la voix.

    Vois-tu par rapport à mes explications de départ ce que je cherche exactement à efffectuer ?

    Edit : MErci jasmine à vrai dire je débute en perl donc c'est un peu flou ce que tu mévoque :'(
      0  0

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par maloute80 Voir le message
    Vois-tu par rapport à mes explications de départ ce que je cherche exactement à efffectuer ?
    Oui, je vois ce que tu cherches à faire, je disais juste qu'il fallait y mettre la manière.

    Ce n'est pas une critique ni une attaque personnelle, mais j'ai l'impression que sur ce forum, depuis quelques semaines (mois ?), on croise de plus en plus d'apprentis perlistes qui posent des questions pertinentes pour des problèmes simples et qui ne donnent pas l'impression d'évoluer. Comme si les réponses qu'on leur donnait ne servait juste qu'à résoudre CE problème sans que ça ne serve pour la suite.

    Jasmine80 t'as parfaitement mis sur la piste, je ne vois pas grand chose à rajouter par rapport à ses réponses
      0  0

  8. #8
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Pense aux tutoriaux de ce site
    Sinon il y a aussi
    http://perl.enstimac.fr/DocFr/perlfunc.html#item_m/
    Tu peux aussi utiliser le moteur de recherche google avec des mots clés tels que "perl expressions régulières" et "perl lecture fichier"



    Jasmine,
    -- Jasmine --
      0  0

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    Ce n'est pas une critique ni une attaque personnelle, mais j'ai l'impression que sur ce forum, depuis quelques semaines (mois ?), on croise de plus en plus d'apprentis perlistes qui posent des questions pertinentes pour des problèmes simples et qui ne donnent pas l'impression d'évoluer. Comme si les réponses qu'on leur donnait ne servait juste qu'à résoudre CE problème sans que ça ne serve pour la suite.
    Je comprend que pour vous les débutants sont un peu des fardeaux je dirai même des boulets et pourtant vous êtes là encore à nos cotés pour nous aider du meilleur que vous pouvez, mais je peus te dire que je n'y connaisez rien avant arriver sur le forum sauf en langage C,C++ et PHP et maintenant Perl m'est plus inconnu et je commence à voir et seulement à voir le début du tunnel qui était pour moi trés trés loin. Alors merci à vous tous pour votre aide, votre patience et vos explications qui font que nous les débutants nous vous apprécions énormement et nous pousse à apprendre en résoudant nos propre problémes
      0  0

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    Je cherche comment fonctionne la fonction split

    2) tant que ligne = fichier (boucle et lecture ligne par ligne)
    split (";", ligne)
    récupérer les informations
    écrire les informations relatives à cette ligne avant de traiter la suivante
    car pour affiicher mes ligne une par une pas de souci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/usr/bin/perl
    use strict;
     
    open my($file), '<', 'ENT_MAT.txt' 
      or die "Impossible Ouverture Fichier\n";
    while( my $line = <$file> ) {
           chomp($line) ;
            print "$line \n";
    }
    mais pour intégrer split un peu plus dur

    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
     
    #!/usr/bin/perl
    use strict;
     
    open my($file), '<', 'ENT_MAT.txt' 
      or die "Impossible Ouverture Fichier\n";
    while( my $line = <$file> ) {
     
            split /;/,$ligne;
      #      split (";",$ligne);
    #Récupération ligne par ligne
    #        chomp($line) ;
     
            print "$line \n";
    }
    D'avance merci.
      0  0

  11. #11
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Pour voir comment fonctionne la fonction split, regarde ici :

    http://perl.enstimac.fr/DocFr/perlfunc.html#item_split

    split découpe la chaîne EXPR en une liste de chaînes et la retourne.

    Exemple : @fields = split /A/, "1A2B3";

    Ici, @fields reçoit comme valeurs après le split "1" et "2B3" puisque le caractère "A" a servi comme motif pour découper la chaîne de départ.


      0  0

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    donc par rapport à mon fichier txt il lui faut que des ";"
    2 A;Biologie;EPS;Francais;Hist-géo;Informatique
    2 B;Biologie;EPS;Francais;Hist-géo;Informatique
    1 A;Biologie;EPS;philosophie;Hist-géo
    1 B;Biologie;EPS;philosophie
    T A;EPS;Hist-géo
    T B;EPS;Hist-géo;francais
    Puis je le découpe grâce à la fonction split chaque ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #!/usr/bin/perl
    use strict;
     
    open my($file), '<', 'ENT_MAT.txt' 
      or die "Impossible Ouverture Fichier\n";
    while( my $line = <$file> ) {
            @tab = split /;/, $ligne;
    }
    comment @tab va-t-il récupérer toute mes lignes et comment les afficher par exemple une par une "print @tab[1]?"
      0  0

  13. #13
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Si je prend pour exemple la 1ère ligne du fichier, @tab contiendra ceci après le split sur le caractère ; :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "2 A", "Biologie", "EPS", "Francais", "Hist-géo", "Informatique"
    Citation Envoyé par maloute80 Voir le message
    comment @tab va-t-il récupérer toute mes lignes et comment les afficher par exemple une par une "print @tab[1]?"
    Attention : c'est ligne par ligne que toute la suite de ton programme doit travailler pour charger correctement les données. Donc, dès qu'une ligne est lue, @tab se remplit, tu travailles sur ces données (pour les charger dans un hachage par exemple), puis tu passes à la ligne suivante. Ne charge pas toutes les lignes en les éclatant d'un coup dans @tab.
      0  0

  14. #14
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $tab[0] = "2 A"
    $tab[1] = "Biologie"
    $tab[2] = "EPS"
    $tab[3] = "Francais"
    $tab[4] = "Hist-géo"
    $tab[5] = "Informatique"
    donc un
    te donnera 2 A

    @tab est le "tableau indexé" contenant l'ensemble des valeurs. Comme son nom l'indique chaque valeur du tableau à un index. Pour accéder à une des valeurs en particulier tu utilises la notation $tab[index].



    nb : en Perl les index commencent toujours par 0 et non par 1.

    Jasmine,
    -- Jasmine --
      0  0

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    Peut-on utiliser des tableaux 2 dimensions comme en C?
    n=0;
    boucle(findefichier)
    m=0;
    boucle(findeligne)
    tab[n][m];
    (le code pour recupérer entre les
    n=n+1;
    finboucle
    m=m+1;
    finboucle
      0  0

  16. #16
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    Je ne connais pas le C mais on peut créer des tableaux à plusieurs dimensions en Perl. Cela est très bien expliqué sur le site ci-dessous.
    http://perso.univ-rennes1.fr/francoi...ERLnode15.html



    Jasmine,
    -- Jasmine --
      0  0

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    Me revoilà ,
    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/perl
    use strict;
     
    my @tab = undef;
     
    open my($file), '<', 'test.txt' 
      or die "Impossible Ouverture Fichier\n";
     
    while(<$file>) 
    {
       @tab=split(/;/, $_);
    #        @tab= split /;/, $ligne;
    #   push @tab, [split(/;/, $_)];
    print @tab[$_];
    }
    fichier test.txt
    Nom:prenom:age
    toto:to:21
    titi:ti:18
    tata:ta:21
    je veut récupérer chaque valeur de chaque ligne j'ai tester différent méthode sans grand résultat j'ai du mal aussi sur l'affichage

    D'avance merci,
    Maloute.
      0  0

  18. #18
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    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
    #!/usr/bin/perl -w
     
    use strict;
    use warnings;
    use Data::Dumper;
     
    my $InFile = "P:/Perl/scripts/Files/test.txt";
    open (InFile,"$InFile") or die "Can't open file\n";
    my $Ligne;
    my %Table;
     
    # lecture du fichier ligne par ligne
    while ($Ligne=<InFile>)
    {
     
            if($Ligne =~ /(\w*):(\w*):(\d*)/)
            {
                    $Table{$1}{PRENOM}=$2;
                    $Table{$1}{AGE}=$3;
            }
    }
    close(InFile);
     
    # pour visualiser ton tableau globalement
    print Dumper (%Table);
     
     
    # Pour accéder à une valeur bien spécifique du tableau
    foreach my $Nom (keys %Table)
    {
            print "\nNOM =".$Nom."\n PRENOM =".$Table{$Nom}{PRENOM}."\n AGE =".$Table{$Nom}{AGE}."\n";
    }
    Vu que ton fichier contient toujours les 3 mêmes informations, il est préférable d'utiliser les expressions régulières que le split. J'avais conseillé le split car tu récupérais un nombre variable de noms de cours.
    Il faut que tu télécharges le module Data:: Dumper qui te permet de voir ton tableau globalement mais ce n'est pas nécessaire, tu peux aussi accéder au valeurs du tableau une à une. Si tu ne veux pas utiliser Data:: Dumper, efface la 5ème et 28ème ligne.

    Il faut aussi dire au programme de commencer à lire le fichier à partir de la seconde ligne ... mais je ne sais plus comment faire ça. C'est juste une petite ligne à ajouter au code. Recherche un peu comment faire sur le net.
    L'ennui est que le programme va récupérer ta première ligne (Nom:prenom:age
    ).
    Sinon tu peux aussi mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($Ligne =~ /(\w*):(\w*):(\d{1,}*)/)
    où \d{1,} signifie au moins 1 chiffre ce qui évite de récupérer la première ligne contenant "age".

    N'hésite pas à poser des questions.


    Jasmine,

    Voici le lien où télécharger le module Data:: Dumper
    http://search.cpan.org/~ilyam/Data-D....121/Dumper.pm
    -- Jasmine --
      0  0

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    Excuse-moi je suis en test du code modifier par vos soins
    je voudrai quelque explication car je suis la surtout pour ça
    les lignes suivants
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            if($Ligne =~ /(\w*):(\w*):(\d*)/)
            {
                    $Table{$1}{PRENOM}=$2;
                    $Table{$1}{AGE}=$3;
            }
    D'avance merci.

    Edit : test effectué mais rien s'affiche ni erreur ni tableaux est-ce normal?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # pour visualiser ton tableau globalement
    print Dumper (%Table);
      0  0

  20. #20
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    C'est un peu complqiué en effet.
    C'est ton tableau complexe.

    Dans l'expression régulière tu recherches
    ce qui veut dire
    (un ensemble de caractères alphanumériques): (un ensemble de caractères alphanumériques): (un ensemble de chiffres)
    Les valeurs sont récupérées dans $1, $2 et $3.

    Pour
    $1 (ici la valeur du nom récupérée) est la clé du tableau.
    Puis tu as la clé PRENOM (fixe) et ensuite la combinaison {toto}{PRENOM} ont la valeur $2 (ici = le prénom = to)
    -- Jasmine --
      0  0

Discussion fermée
Cette discussion est résolue.
Page 1 sur 5 12345 DernièreDernière

Discussions similaires

  1. Réponses: 8
    Dernier message: 25/02/2009, 15h52
  2. Problème Lecture fichier
    Par Gebudi. dans le forum C++
    Réponses: 1
    Dernier message: 29/05/2006, 08h37
  3. problème lecture fichier
    Par Pleymo dans le forum Langage
    Réponses: 2
    Dernier message: 23/11/2005, 09h00
  4. [SAX] Problème lecture fichier xml
    Par BernardT dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 07/07/2005, 18h11
  5. Problème lecture fichier en C++
    Par cali1983 dans le forum C++
    Réponses: 17
    Dernier message: 20/05/2005, 09h36

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