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 :

condition if et recherche des motifs


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
    Août 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut condition if et recherche des motifs
    Bonjour
    J’ai un fichier contenant chaque ligne un terme et son catégorie grammaticale.
    Je cherche le motif 1 dans une ligne et le motif 2 dans une ligne. Si les deux ligne contiennent le même terme, je veux supprime la ligne où il y le motif 2. Est il possible d’écrire la valeur de la ligne du motif 2 comme $mot3=$5. J’ai aussi un problème pour supprimer pour la ligne du 2e motif. Merci beaucoup.

    Ex :
    livre,livre.n+py=xxx
    livre,livre.v+py=xxx
    pouvoir,pouvoir.n+py=xxx
    pouvoir,pouvoir.v+py=xxx
    en,en.pre+py
    en,en.pron+py

    Voici mon programme
    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
    20
    21
    22
    23
    24
    25
    while ($ligne = <INFILE>){
     
     
    		# recherche du motif 1 qui contient le cat "n" et du motif 2 contenant le cat "ng"
    		if($ligne=~/^(([^,]+),([^.]+)\.n\+py.+)/ eq $ligne=~/^(([^,]+),([^.]+)\.ng\+py.+)/){
     
    		$mot1=$1;
    		$mot2=$2;
     
    		$mot3=$5;
    		#print OUTFILE "$mot1\n";
    		}
     
     
    		if ($mot2 eq $mot5){
     
    		#print OUTFILE "$mot1\n";
     
    		#print OUTFILE "$mot3\n";
    		}
    print OUTFILE "$mot1\n";
    #print OUTFILE "$ligne\n";
     
     
    }

  2. #2
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Je cherche le motif 1 dans une ligne et le motif 2 dans une ligne.
    Faut-il donc tester toutes les lignes 2 à 2? Ou seulement les lignes successives?
    Qu'est-ce que le motif 1 et le motif 2? Peux-tu donner un exemple précis?

    Si les deux ligne contiennent le même terme, je veux supprime la ligne où il y le motif 2.
    On ne peut pas supprimer les lignes d'un fichier voir lien, il faut recopier le contenu à garder dans un nouveau fichier.

    Est il possible d’écrire la valeur de la ligne du motif 2 comme $mot3=$5.
    Qu'est-ce que $mot 3 et $5? Peux-tu expliquer avec un exemple?


    Merci,

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut
    Bonjour

    Je veux tester deux conditions :

    1) $ligne=~/^(([^,]+),([^.]+)\.n\+py.+)/

    2) $ligne=~/^(([^,]+),([^.]+)\.ng\+py.+)/


    Pour le motif 1, je cherche la ligne où il y a le terme qui contient la catégorie grammaticale n (dans mes exemples, la lettre qui est juste après le point) et le motif 2, je cherche la ligne où il y a le terme qui contient une autre catégorie ng par exemple. S’ils sont les mêmes termes, je ne garde que la ligne où il y a le motif 1, mais pas le motif 2 dans le fichier sortie.

    if($ligne=~/^(([^,]+),([^.]+)\.n\+py.+)/ eq $ligne=~/^(([^,]+),([^.]+)\.ng\+py.+)/)
    Le $mot3=$5, c’est le 2e parenthèse de la 2e $ligne, je ne sais pas si c’est possible de déclarer comme ca.

    Merci beaucoup

  4. #4
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Voila ce que tu essaies de faire écrit d'une autre façon :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
     
     
    open my $infile, '<', 'test.txt' or die $!;
    open my $outfile, '>', 'output.txt' or die $!;
     
    my $last_line;
     
    while (my $line = <$infile>){
     
    	if ($. == 1){
    		$last_line = $line;
    		next;
    	}
    	else{
    		my ($mot1, $mot2, $mot3, $mot4, $mot5, $mot6);
     
    		if ( $last_line =~ m/^(([^,]+),([^.]+)\.n\+py.+)/){
    			$mot1 = $1;
    			$mot2 = $2;
    			$mot3 = $3;
    		}
     
    		if ( $ligne =~ m/^(([^,]+),([^.]+)\.ng\+py.+)/){
    			$mot4 = $1;
    			$mot5 = $2;
    			$mot6 = $3;			
    		}
     
    		if ($mot2 eq $mot5){
    			print $outfile ...;
    		}
    	}
    }
     
    close $infile;
    close $outfile;
    Cela ne traite que les lignes successives dont la première doit contenir .n et la seconde .ng. Tu dois l'adapter à tes besoins. Si tu dois comparer toutes les lignes 2 à 2, c'est plus compliqué.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Par défaut
    Bonjour

    Je fais comme ca ci-dessous. Le if($mot2 eq $mot4), on doit le mettre à l'intérieur de if du motif 2, sinon, il n'y a rien dans le fichier sortie.
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    while ($ligne1 = <INFILE>){
     
     
    		$compteur++;
     
    		#print OUTFILE $compteur." "."$ligne1";
     
    		# recherche du motif 1 qui contient le cat "n"
    		if($ligne1=~/^(([^,]+),([^.]+)\.n\+py.+)/) {
     
    		$mot1=$1;
    		$mot2=$2;
    		#print OUTFILE "$mot1\n";
    		}
    		# recherche du motif 1 qui contient le cat "ng"
    		if($ligne1=~/^(([^,]+),([^.]+)\.ng\+py.+)/) {
    		$mot3=$1;
    		$mot4=$2;
    		#print OUTFILE "$mot3\n";
     
    		if($mot2 eq $mot4){
     
     
    		print OUTFILE $compteur." "."$mot1\n";
    		#print OUTFILE "$mot3\n";
    		}
    		}
     
    }
    Est il possible d'afficher aussi les lignes ou il y ni motif 1 ni motif 2, et de garder l'ordre du fichier entrée ? Merci

  6. #6
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par wulucie Voir le message
    Est il possible d'afficher aussi les lignes ou il y ni motif 1 ni motif 2, et de garder l'ordre du fichier entrée ? Merci
    Essaie d'incrémenter l'intérieur de tes blocs, ça serait plus lisible.
    Utilise use strict et déclare tes variables, ce sera un code plus propre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($ligne !~ m/$mot1|$mot2/)
    Si tu écris dans ton fichier de sortie au fur et à mesure, cela gardera l'ordre du fichier d'entrée.

Discussions similaires

  1. Rechercher des cours gratuits sans condition d'auteur
    Par Moutaallime dans le forum Petites annonces
    Réponses: 6
    Dernier message: 29/08/2016, 16h47
  2. Réponses: 5
    Dernier message: 17/02/2015, 19h14
  3. Réponses: 16
    Dernier message: 02/08/2012, 21h00
  4. recherche des algorythmes pour images 2d
    Par exxos dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 24/05/2002, 13h46
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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