Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Langage
Langage Toutes vos questions sur les scripts Perl en général. Avant de poster, veuillez consulter les FAQs perl, les cours Perl, les critiques de livres et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/11/2012, 11h12   #1
Gamaq
Invité de passage
 
Inscription : 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
Gamaq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2012, 11h44   #2
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 572
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 : 572
Points : 1 124
Points : 1 124
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);
}
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2012, 12h02   #3
Gamaq
Invité de passage
 
Inscription : novembre 2012
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2012
Messages : 3
Points : 1
Points : 1
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
Gamaq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2012, 13h38   #4
Gamaq
Invité de passage
 
Inscription : novembre 2012
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2012
Messages : 3
Points : 1
Points : 1
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 !
Gamaq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2012, 19h13   #5
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 572
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 : 572
Points : 1 124
Points : 1 124
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.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h52.


 
 
 
 
Partenaires

Hébergement Web