Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  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 :
    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 :
    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 :
    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
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    984
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 984
    Points : 2 134
    Points
    2 134

    Par défaut

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

    Code :
    if ($cols[2] eq $nature and $cols[3] eq $chplex) { # ...
    Voici à peu près ce que je ferais:

    Code :
    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);
    }
    Mes articles sur ce site: La programmation fonctionnelle en Perl - Partie 1: les opérateurs de liste et La programmation fonctionnelle en Perl - Partie 2: les fonctions d'ordre supérieur
    ______

    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 :
    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
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    984
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 984
    Points : 2 134
    Points
    2 134

    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.
    Mes articles sur ce site: La programmation fonctionnelle en Perl - Partie 1: les opérateurs de liste et La programmation fonctionnelle en Perl - Partie 2: les fonctions d'ordre supérieur
    ______

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •