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 :

perl et la manipulation des fichier text


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 37
    Par défaut perl et la manipulation des fichier text
    Bonjour,

    je suis debutante en perl et je sollicite votre aide! mon probleme ests le suivant:

    je desire analyser un tres grand fichier text et voici un extrait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    [3] est la quantite du legume : tomate
    il ya des tomates des navets et pas de carottes
    [4] est la quantite du legume : navet
    [6] est la quantite du legume : chou
    ggggggggggggggjlkjdshryzy
    [9] est la quantite du fruit : orange
    [8] est la quantite du fruit : banane
    il ya pas de fraise 
    [5] est la quantite du fruit : pomme
    pas de pain de compagne
    [13] est la quantite du pain : croissant
    gfjgdsfgjgdjfhgdjhgfjhdsgfjhqgdhjfg
    [3] est la quantite du pain : pain au chocolat
    et je desire savoir les produits presents dans la dans le fichier alors il faudrait que j'aurais le resulta suivant: legume, fruit et pain

    j'ai le script suivant mais il affiche toutes les les ligne qui ont le format de l'expression regulier alors que c pas ce qui est demandé
    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
     
    open FILE, "hh.txt";
     
     
    while ($line=<FILE>){
    	if ($line=~/\[(.*)\] (.*) quantite du (.*)/) {
     
     
                 print "$line";
     
    	 }
     
    }
     
    close FILE;
    pourriez-vous m'aimer a debloquer ce bug?

    je vous remercie a l'avance

  2. #2
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Tu devrais lui faire afficher ta troisième capture ($3) au lieu de la ligne $line. Tu peux aussi simplifier (et raffiner) ta regex.

    Voilà un exemple (qui en fait un peu plus, en matière de capture et d'affichage), qui devrait te permettre de progresser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my %products;
    while (<FILE>) {
        $products{$2} += $1 if (/\^[(\d+)\].*: ([\w| ]*)$/);
    }
    print map {"$_ $products{$_}\n"} sort keys %products;
    La capture est à la fois plus simple (je prends que ce dont j'ai besoin) et plus précise (j'en dis plus sur où il faut prendre).

    Rappel :
    ^ et $ sont les ancres de début et de fin de chaîne. La précision permet d'éviter les lignes qui ne comment pas par [\d+].

    \d pour chiffre, \w pour alphanumérique et | alternative
    L'utilisation d'un tableau associatif (hash) te permets de compter les éléments (tu n'es pas obligé!), tout en stockant le nom des produits. Clé du hash = nom et valeur du hash = nombre (avec incrémentation si déjà présent).

    le map {} prend une liste en entrée (liste des clés du hash) et recrache une liste de chaînes (en l'occurence la clé et sa valeur) à print.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 37
    Par défaut
    merci pour votre reponse .

    mon probleme est un peu complexe car apres je vais m'enservire du resultat de ce fichier par la suite dans autre chose,

    j'ai modifié le scrip comme suit :
    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
    #!/usr/bin/perl
     
    open FILE, "hh.txt";
     
     
    while ($line=<FILE>){
     
    	if ($line=~/\[(.*)\] (.*) quantite du (.*) :(.*)/) {
     
     
                 print "$3\n";
     
    	 }
     
    }
     
    close FILE;
    et j'aurai le resultat suivant:
    legume
    legume
    legume
    fruit
    fruit
    fruit
    pain
    pain

    mais moi je veux just avoir le resultat suivant:
    legume
    fruit
    pain

    merci pour votre reponse

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 37
    Par défaut
    je pense que il faudrait que je compare l'element $3 avec les element du tableau s'il il n'existe pas dans le tableau alors je l'ajoute mais sinon si il existe je l'ajoute pas pas au tableau et vers la fin j'affiche ce tableau !! je pense que c'est ça la solution.

    mais le probleme je manipule pas bien les tableau .

    Pourrier vous m'aider SVP

    merci d'avance;

  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
    Citation Envoyé par linda8080 Voir le message
    je pense que il faudrait que je compare l'element $3 avec les element du tableau s'il il n'existe pas dans le tableau alors je l'ajoute mais sinon si il existe je l'ajoute pas pas au tableau et vers la fin j'affiche ce tableau !! je pense que c'est ça la solution.
    En fait il y a plus simple : il suffit d'utiliser un hash. Dans un hash, les clés sont uniques, donc même si tu rajoutes plusieurs fois la même clé, il n'y aura toujours qu'une seule clé avec cette dénomination.

    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
    #!/usr/bin/perl
    use strict; use warnings;
     
    my $filename = 'hh.txt';
    open my($file), '<', $filename
      or die "N'a pas pu ouvrir $filename : $!\n";
     
    my %products;
    while (my $line = <$file>){
       if ($line =~ m/^\s*\[(\d+)\] [^d]* du (\w+) :/) {
          $products{$2} += $1;
       }
    }
     
    print join "\n", sort keys %products;
     
    __END__
    --
    Jedaï

  6. #6
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    En fait il y a plus simple : il suffit d'utiliser un hash. Dans un hash, les clés sont uniques, donc même si tu rajoutes plusieurs fois la même clé, il n'y aura toujours qu'une seule clé avec cette dénomination.
    Si tu avais lu, ou simplement exécuté le code que je t'ai proposé, tu aurais réalisé par toi-même ce que te dis Jedaï.

    Car le code fait exactement cela. Bien sûr tu peux ne pas afficher le nombre d'occurrence.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print map {"$_\n"} sort keys %products;
    De plus si tu n'as vraiment que faire du nombre de produits, tu peux aussi ne pas les capturer et ne pas les stocker dans le hash.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $products{$1} = 1 if (/^\[\d+\].*: ([\w| ]*)$/);
    (La regex de Jedaï est — bien entendu — encore plus précise)

    Je t'avais proposé l'exemple non pas pour que tu aies du prêt à emporter mais pour t'aider à comprendre comment faire.

    Ah oui, si tu veux préserver l'ordre dand lequels les produits sont rencontrés, empilent les dans une liste à la première occurrence (là encore le hash t'est utile).

Discussions similaires

  1. Manipulation des fichiers textes sous DELPHI
    Par riad.yahiaoui dans le forum Débuter
    Réponses: 9
    Dernier message: 24/04/2014, 16h47
  2. Manipuler des fichiers Excel avec Perl
    Par Buboba dans le forum Modules
    Réponses: 2
    Dernier message: 04/09/2012, 13h54
  3. Manipulation des fichiers textes
    Par tickerdu22 dans le forum C#
    Réponses: 1
    Dernier message: 17/02/2008, 19h45
  4. Réponses: 2
    Dernier message: 07/10/2007, 19h52
  5. Réponses: 3
    Dernier message: 24/05/2007, 10h21

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