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 :

[langage] Problème hachage, liste et retour à la ligne


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 8
    Points : 5
    Points
    5
    Par défaut [langage] Problème hachage, liste et retour à la ligne
    Bonjour à tous,

    voila mon problème, 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
    15
    16
    while ($lign = <TXT>) {
     
            chomp ($lign);
    	$lign =~ s/\ //g;
    	$lign =~ s/\t$//g; #remplacement des espaces, tabulations, retours à la ligne
    	push (@liste, $lign);
    	}
    print TXT2 @liste;
     
    close TXT2;
     
    print "@liste" ;
     
    %h = @liste;
     
    }
    est censé transformée un fichier texte de la forme :

    Nom
    Blablala1
    Nom2
    Blabalabla2

    en table de hachage : Nom=>Blabla1, Nom2=>Blablabla2

    malheureusement le Blablabla est souvent long et prend plusieurs lignes...Or malgré mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    chomp ($lign);
    	$lign =~ s/\ //g;
    	$lign =~ s/\t$//g;
    des clés et des valeurs mal associées (par exemple une partie de Blabla1 devient une clé et l'autre partie la valeur associée) à cause des retours à la ligne du fichier texte, qui restent présents malgré mon bout de code censé les virer...J'ai essayé \t \r \s dans l'expression regulière sans résultats....


  2. #2
    En attente de confirmation mail
    Inscrit en
    Mars 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 67
    Points : 75
    Points
    75
    Par défaut
    \n peut-être?

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 87
    Points : 281
    Points
    281
    Par défaut
    à mon avis, essaye plutot avec

    qui permet de prendre en compte plusieurs lignes
    tu peux aller voir ici http://www.perldoc.com/perl5.8.0/pod/perlre.html

    cette page décrit l'utilisation des exp régulières.
    tu descend un peu dans la page et ça parle du modifier m,

    bon courage 8)

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while ($lign = <TXT>) {
     
      chomp ($lign);
    	$lign =~ s/\ //g;
    	push (@liste, $lign);
    	}
    /n ne change rien...et avec /m aucune ligne n'est traitée...

    Bizarrement, le fichier creé ne contient plus aucun espace, ni retour à la ligne, nada, keud'...Pile poil ce que je voulais...

    Mais la liste que je veux faire n'arrive toujours pas à assimiller correctemment, elle prend en compte des espaces ou des retours à la lignes ou que sait-je qui ne sont pas visible dans le fichier ...

    Le plus étrange c'est qu'avec ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print TXT2 @liste;
    print "@liste" ;
    logiquement ce que contient le handle TXT2 est conforme à @liste, or mon handle se fait bien comme je veux (une seule ligne comprenant toutes les données, que je traiterais après) tandis que la liste est découpé de tout ces espaces-retouràlaligne-ou je ne sais quoi qui me ruinent ma table de hashage ...

  5. #5
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Je pense qu'un petit slurp (si ton fichier n'est pas trop long) suivi d'un split devrait faire l'affaire non ??
    --
    Jedaï

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    euh j'ai peut être omis de préciser que je débute en Perl, donc slurp me fait penser à quelque chose mais ce n'est pas du Perl

    Je vais voir ça, merci

    Pour preciser un peu, par ce que je sens que je ne suis pas clair :

    J'ai ça :

    Réference
    ADGHETE
    EGDTHYJ

    Ave mon programme j'ai un fichier texte comme ça :

    RéferenceADGHETEEGDTHYJ

    et une liste qui donne :

    Réference ADGHETE EGDTHYJ

    d'où une table de hashing fausse, qui me donne :

    Clé =Réference Valeur = ADGHETE
    Clé =EGDTHYJ Valeur = ....etc..

    alors que je voudrais :

    Clé= Réference Valeur=ADGHETEEGDTHYJ

    J'espère que je suis un peu plus clair....J'y cromprend rien, j'ai supprimé tout les retours à la ligne, les espaces, les tabulations...rien n'y fait, ma liste est toujours avec des espaces

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 8
    Points : 5
    Points
    5
    Par défaut [RESOLU]
    Bon j'ai résolu le problème en passant par un fichier intermédiaire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (my $lign = <FICH>) {
     
    	$lign =~ s/ //g;    #remplacement des espaces
    	$lign =~ s/\n//g; #remplacement des retours à la ligne
    print FICH2 $lign;
     
    }
    ensuite je reouvre le deuxième fichier en lecture et je place l'unique ligne qui le compose dans une liste que je manipule ensuite à ma guise...

    Pas top pratique mais bon, ca marche

  8. #8
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Je pense qu'un truc comme ça serait plus optimisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    { local $/; $_ = <DATA> }
    my @liste = split;
    Testé et approuvé par mes soins (sauf si tes clés ou valeurs risquent de contenir des espaces, mais ta solution ne marche pas dans ce cas, de toute façon).

    [EDIT] Je viens de relire ton exemple et je ne comprend pas vraiment comment tu fais la distinction entre les clés et les valeurs ??
    --
    Jedaï

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    eheh ben je pensais qu'une table de hachage comprenait instinctivement que le premier élément d'une liste est la première clé, le deuxième la première valeur, etc....

    Et c'est bien ce qui se passe, sauf que la table mélange tout après

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

Discussions similaires

  1. probleme de retour a la ligne dans une liste
    Par dedel53 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 24/04/2007, 11h28
  2. ne pas perdre info d'une liste apres retour serveur
    Par decksroy dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 11/01/2007, 11h23
  3. affecter une liste à un retour de fonction
    Par irenee dans le forum ASP
    Réponses: 4
    Dernier message: 24/04/2006, 14h02
  4. [langage] Prb Tabeau de hachage
    Par vodevil dans le forum Langage
    Réponses: 2
    Dernier message: 22/04/2005, 23h59
  5. [langage] compter les retour à la ligne
    Par Kinethe dans le forum Langage
    Réponses: 4
    Dernier message: 16/07/2004, 16h36

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