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 :

Extraction de deux ligne successives


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut Extraction de deux ligne successives
    Bonjour tout le monde

    Je dois faire un programme qui permet d'extraire deux lignes successives selon deux conditions la première ligne contient le mot NOM et la deuxième contient le mot ADJ

    par exemple:
    président NOM président
    général ADJ général
    force|forces ADJ force|forces
    gouvernement NOM gouvernement
    chef NOM chef
    politique ADJ politique
    océan NOM océan
    et KON et
    relever VER:infi relever
    du PRP:det du
    phénomène NOM phénomène
    el VER:futu el
    ca doit donner
    président
    général
    chef
    politique
    donc on doit extraire le NOM+ADJECTIF

    j'ai trouvé un code sur le net et avec des modifications il a marché mais le problème il y a des instructions que j'ai pas comprise:
    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
    42
    43
    44
    45
    46
    #!/usr/bin/perl -w
     
     
    my $fileName = "text.txt";
    open (LOGFILE,"<",$fileName) or die "Ouverture de $fileName
    impossible !Erreur : $!";
    print "choisis un nom de fichier pour contenir les termes extraits\n";
    my $fic=<STDIN>;
    open(FIC1, ">$fic");
     
    my $currentLine="";
    my $previousline="";
    my $nextline="";
     
    my @liste=();
    my @liste1=();
    my $i=0;
     
    while (lecture()) {
     
    if ($currentLine =~/NOM/ and $nextline=~/ADJ/) {
    my $ligne=$currentLine;
        my @liste=split(/\t/,$ligne);
    my $ligne1=$nextline;
        my @liste1=split(/\t/,$ligne1);	
     
    print FIC1 "$liste[0] ";
    print FIC1 "$liste1[0]\n";
     
     
     
    }
    }
     
    close LOGFILE;
     
     
     
     
     
    sub lecture {
    $previousline = $currentLine;
    $currentLine = $nextline;
    if (defined($nextline = <LOGFILE>)) { chomp($nextline) }
    return defined($currentLine);
    }
    ce que j'ai pas compris l'utilité des instructions suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $previousline = $currentLine;
    $currentLine = $nextline;
    merci pour votre aide

  2. #2
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Le programme n'est pas très difficile
    mais mon problème
    c'est comment il arrive à garder en mémoire la ligne courante et la ligne suivante pour faire les test à chaque itération
    qui se traduit avec cette procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub lecture {
    $previousline = $currentLine;
    $currentLine = $nextline;
    if (defined($nextline = <LOGFILE>)) { chomp($nextline) }
    return defined($currentLine);
    }
    Merci

  3. #3
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Points : 322
    Points
    322
    Par défaut
    Tu stockes en mémoire trois lignes : la ligne précédente, celle que tu analyses et la suivante ($nextLine).
    Lorsque tu veux avancer, tu stockes une nouvelle lue dans le fichier dans $nextLine et tu décales les deux autres ($previousLine devient $currentLine et $currentLine devient $nextLine).

    Le mieux pour toi serait de dérouler l'algorithme sur papier.
    Un exemple simple : on lit la ième ligne dans le fichier.
    $previousLine = i-2
    $CurrentLine = i-1
    $nextLine = i

    On lit la ligne suivante : i+1ème ligne, donc. On va l'appeler j.
    $previousLine = $currentLine = i-1 = ( (i+1) - 1 ) -1 = j - 2
    $currentLine = i = (i+1) - 1 = j - 1
    $nextLine = i+1 = j

  4. #4
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Prenons l'exemple du fichier
    président NOM président
    général ADJ général
    force|forces ADJ force|forces
    gouvernement NOM gouvernement
    chef NOM chef
    politique ADJ politique
    océan NOM océan
    et KON et
    relever VER:infi relever
    du PRP:det du
    phénomène NOM phénomène
    el VER:futu el

    d'après ce que j'ai compris
    la première itération
    $previousline=$currentline=" ";
    $currentline=nextline=" ";

    la focntion lecture retourne currentline qui est " "

    2ème itération
    $previousline=$currentline=" ";
    $currentline=nextline=président NOM président;

    la focntion lecture retourne currentline qui est président NOM président

    et ainsi de suite

Discussions similaires

  1. Remplacement avec Sed sur deux lignes successives
    Par Synack92 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 18/05/2014, 16h17
  2. Supprimer deux lignes successives non identiques
    Par korospoukine dans le forum Langage SQL
    Réponses: 14
    Dernier message: 29/01/2013, 12h48
  3. Réponses: 5
    Dernier message: 09/01/2005, 19h54
  4. [VB.NET] DataGrid : titre des colonnes sur deux lignes
    Par Lahouari dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/12/2004, 14h44
  5. Deux lignes sur un TButton
    Par bml dans le forum Composants VCL
    Réponses: 2
    Dernier message: 24/07/2003, 11h17

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