p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Invité de passage
    Inscrit en
    novembre 2012
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : novembre 2012
    Messages : 3
    Points : 1
    Points
    1

    Par défaut Pb pour filtrer des données

    Bonjour,
    Je suis plutôt débutant en perl, et essaie de développer un script servant à me créer des fiches de vocabulaire pour m'aider dans l'apprentissage d'une langue que j'étudie.

    Je note mon vocabulaire sur un fichier texte sous le format suivant (avec encore d'autres spécifications, que je ne vais pas mettre par souci de clarté) :
    mot1Langue1;mot1Langue2;natureDuMot;champLexical;
    mot2Langue1;mot2Langue2;natureDuMot;champLexical;
    ...

    Le but de mon script est de pouvoir filtrer les données de ce fichier, et créer une fiche de vocabulaire correspondant aux choix définis par l'utilisateur.
    Par exemple, me sortir une fiche avec tous les adjectifs correspondant au champ lexical "couleur"

    J'ai donc, au début de script, ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ### On ouvre le fichier ou se trouve la liste de vocabulaire
    open (LISTE, 'dbvoc.txt');
     
    ### Quel type de mot nous intéresse
    print "Nature \n";
    my $nature = <stdin>;
    chomp($nature);
     
    ### Quelle thématique nous intéresse
    print "Champ lexical \n";
    my $chplex = <stdin>;
    chomp($chplex);
    De la même façon, on nous pose 2 autres questions pour définir la forme finale de la fiche à sortir.

    Ensuite, j'ouvre le fichier dans lequel je vais copier mes données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ### On ouvre / créé le fichier dans lequel sera copie le vocabulaire.
    open (FICHEVOC, '>mafiche.txt');
    Le nom de la fiche sera dynamique, selon les critères demandé (mais il faut encore que je m'en occupe)

    Arrive finalement le moment où je dois filtrer mes recherches et les copier dans le fichier.
    Dans la version d'essai, je n'avais qu'une condition, et ça marchait très bien :

    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
    ### Boucle pour inscrire les données filtrées dans la fiche de vocabulaire
    my $cols;
    my $ligne;
     
    while($ligne=<LISTE>)
    {
    	### On se sert des ; séparant les données du fichier pour les mettre dans un tableau
    	@cols = split(";",$ligne);
     
    	### Si la nature du mot correspond à celle demandée, on inscrit les données du mot dans la fiche
    	if ($cols[2] eq $nature)
    	{		
    		print FICHEVOC "\n$cols[0] - $cols[1] - $cols[2] - $cols[3] \n";
    	}
    }
     
    ### On ferme les documents ouverts
    close (FICHEVOC); 
    close (LISTE);
    Ca me sort donc un document avec une liste de tous les mots correspondant à la nature demandée.

    Seulement, puisque je voudrais maintenant prendre en compte plusieurs critères, ça n'est forcément plus si simple, et j'avoue arriver à cours d'idées concernant la marche à suivre pour y parvenir... Si quelqu'un avait une piste à me conseiller, je lui offrirai beaucoup, beaucoup de gratitude.

    --EDIT--
    J'ai oublié de préciser ce qui pose vraiment problème : c'est qu'il est également nécessaire que l'on puisse ne pas spécifier toutes les conditions de recherche... Par exemple, ne demander que de sortir une fiche sur les adjectifs, ou encore, ne demander qu'une fiche sur le champ lexical de la couleur en général

  2. #2
    Expert Confirmé Sénior


    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 744
    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 : 1 744
    Points : 4 692
    Points
    4 692
    Billets dans le blog
    1

    Par défaut

    Si je comprends bien, il suffit d'ajouter une seconde condition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($cols[2] eq $nature and $cols[3] eq $chplex) { # ...
    Voici à peu près ce que je ferais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(my $ligne = <LISTE>) {
            chomp $ligne;
            my ($m1L1, $m1L2, $nat, $chmp) = split /;/, $ligne;
    	print FICHEVOC $ligne, "\n" if ($nat eq $nature and $chmp eq $chplex);
    }
    La programmation fonctionnelle en Perl : 1. les opérateurs de liste; 2. les fonctions d'ordre supérieur; 3. étendre le langage.
    De Perl 5 à Perl 6 : 1. Les bases; 2. Les nouveautés; 3. Approfondissements

    _____
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  3. #3
    Invité de passage
    Inscrit en
    novembre 2012
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : novembre 2012
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    Merci pour ta réponse,
    En fait, le problème persiste, car j'ai oublié de préciser qu'il faut envisager la possibilité que l'utilisateur ne définisse pas tous les critères...

    Je dois donc pouvoir avoir une fiche qui comprend :
    les adjectifs correspondant au champ lexical "nourriture";
    ou encore
    les adjectifs en général, sans prendre en compte de champ lexical;
    les mots correspondant au champ lexical "nourriture" sans prendre en compte la nature
    ...

    A part dans le 1er cas, la condition ne fonctionne pas

  4. #4
    Invité de passage
    Inscrit en
    novembre 2012
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : novembre 2012
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    J'ai fini par trouver quelque chose qui semble fonctionner, je ne suis vraiment pas certain que ça soit la meilleure solution , mais ça me conviendra !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while($ligne=<LISTE>)
     {
    	chomp $ligne;
            my ($m1L1, $m1L2, $nat,$chmp) = split /;/, $ligne;
    	print FICHEVOC $ligne, "\n" if (($nat eq $nature or $nature eq "") and ($chmp eq $chplex or $chplex eq ""));
    }
    Merci en tout cas de m'avoir mis sur la bonne voie !

  5. #5
    Expert Confirmé Sénior


    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 744
    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 : 1 744
    Points : 4 692
    Points
    4 692
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Gamaq Voir le message
    je ne suis vraiment pas certain que ça soit la meilleure solution , mais ça me conviendra !
    Bah, ce n'est peut-être pas la solution la plus élégante (et encore...), mais si ça marche et fait ce que tu veux, c'est le principal.
    La programmation fonctionnelle en Perl : 1. les opérateurs de liste; 2. les fonctions d'ordre supérieur; 3. étendre le langage.
    De Perl 5 à Perl 6 : 1. Les bases; 2. Les nouveautés; 3. Approfondissements

    _____
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

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

Discussions similaires

  1. [WD20] Le choix de la bonne méthode pour filtrer des données
    Par lololebricoleur dans le forum WinDev
    Réponses: 3
    Dernier message: 20/02/2015, 21h04
  2. Réponses: 6
    Dernier message: 27/09/2014, 14h18
  3. Requête pour filtrer des données
    Par altecad dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/02/2008, 14h16
  4. [Persistance]Aide pour sauver des données en XML
    Par le Daoud dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 21/06/2005, 13h39
  5. cherche module ou langage pour récupérer des données audio..
    Par Ry_Yo dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 12/05/2003, 17h44

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