Ligne précédente d'un texte
Résolu
Luluu
-
Luluu -
Luluu -
Bonjour, je débute en perl, comment désigner simplement la ligne précédente dans un fichier txt sans utiliser de tableau ? En fait pour chaque expression trouvée dans une ligne, je dois afficher une information se trouvant dans la ligne au-dessus. Merci de vos réponses.
A voir également:
- Ligne précédente d'un texte
- Partager photos en ligne - Guide
- Mètre en ligne - Guide
- Transcription audio en texte word gratuit - Guide
- Excel cellule couleur si condition texte - Guide
- Aller à la ligne excel - Guide
3 réponses
Bonjour Luluu,
A quoi ressemble ton code ?
Ce qui me vient à l'esprit, a priori, est que dans ta boucle, tu sauvegardes le contenu de la ligne précédente dans une variable avant la fin de ta boucle, pour en disposer lorsque tu traites la nouvelle ligne.
Dal
A quoi ressemble ton code ?
Ce qui me vient à l'esprit, a priori, est que dans ta boucle, tu sauvegardes le contenu de la ligne précédente dans une variable avant la fin de ta boucle, pour en disposer lorsque tu traites la nouvelle ligne.
Dal
Merci de ta réponse. Voici mon code (il est tout bête):
while (my $ligne = <STDIN>) {
chomp $ligne ;
while ($ligne =~ /expression à extraire/ig) {
print $&, " " ;
}
if ($ligne =~ /^<ARTICLEréférence(date)référence>$/) {
print "(", $1, ")\n" ;
}
} # (Entrer dans le terminal: "perl -CIO [chemin du programme] < [chemin du corpus] | sort -u".)
Ça m'affiche la date de chaque article de mon fichier, même de ceux qui ne contiennent pas l'expression que je veux extraire ; or je veux uniquement extraire une (ou des) expression(s) et indiquer la date de l'article dans lequel elle-s se trouve-nt (information qui se trouve donc dans la ligne précédente, puisque chaque article est sur une seule ligne et la réf de l'article avec la date est sur la ligne au-dessus).
À partir de ce que tu m'as dit, j'ai commencé à mettre ma boucle if en premier et à sauver la date dans une variable, mais même avec ça je ne vois pas après comment articuler ma requête (en plus ma maîtrise des variables n'est pas optimale...). Ou sinon, comment éliminer les résultats qui contiennent seulement une date... (j'aimerais éviter d'avoir à retraiter ce que j'obtiens en sortie de ce code via le terminal ou un second programme)
while (my $ligne = <STDIN>) {
chomp $ligne ;
while ($ligne =~ /expression à extraire/ig) {
print $&, " " ;
}
if ($ligne =~ /^<ARTICLEréférence(date)référence>$/) {
print "(", $1, ")\n" ;
}
} # (Entrer dans le terminal: "perl -CIO [chemin du programme] < [chemin du corpus] | sort -u".)
Ça m'affiche la date de chaque article de mon fichier, même de ceux qui ne contiennent pas l'expression que je veux extraire ; or je veux uniquement extraire une (ou des) expression(s) et indiquer la date de l'article dans lequel elle-s se trouve-nt (information qui se trouve donc dans la ligne précédente, puisque chaque article est sur une seule ligne et la réf de l'article avec la date est sur la ligne au-dessus).
À partir de ce que tu m'as dit, j'ai commencé à mettre ma boucle if en premier et à sauver la date dans une variable, mais même avec ça je ne vois pas après comment articuler ma requête (en plus ma maîtrise des variables n'est pas optimale...). Ou sinon, comment éliminer les résultats qui contiennent seulement une date... (j'aimerais éviter d'avoir à retraiter ce que j'obtiens en sortie de ce code via le terminal ou un second programme)
Merci de ton aide, mes lignes ressemblent tout à fait à ce que tu as mis dans ta dernière réponse, mais n'étant pas familière du modificateur s, je me suis finalement basée sur ta 1ère réponse pour écrire ce code qui convient bien :
J'obtiens ce genre de résultat :
Je tenais notamment à ce que les expressions d'un même article soient affichées sur la même ligne.
Je vais cependant explorer ton autre proposition ; je devais écrire ce programme dans le cadre d'exercices d'apprentissage du perl et je préférais m'en tenir à ce que nous avions déjà vu en cours, je bloquais juste sur l'articulation des boucles et des variables ^^'... Mais ça ne m'empêche pas d'aller plus loin avec ce que tu m'as dit :).
Encore merci, bon dimanche :)
my $date ; while (my $ligne = <STDIN>) { chomp $ligne ; if ($ligne =~ /^<A.*\pL+-(\d+)-\pL+.*$/) { $date = $1 ; } if ($ligne =~ /\d+((,|.| )\d+((.| )\d+)?)?( milli(on|ard)s? de)? mots/i) { while ($ligne =~ /\d+((,|.| )\d+((.| )\d+)?)?( milli(on|ard)s? de)? mots/ig) { print $&, " ; " ; } print "(", $date, ")\n" ; } }
J'obtiens ce genre de résultat :
134.445 mots ; 26.000 mots ; (2012) 40 mots ; (2012) 1 457 mots ; (2013) 109 689 mots ; 120 378 mots ; (2013) 1,6 milliard de mots ; 47 mots ; 47 mots ; 57 mots ; 47 mots ; 47 mots ; 20 mots ; (2013)
Je tenais notamment à ce que les expressions d'un même article soient affichées sur la même ligne.
Je vais cependant explorer ton autre proposition ; je devais écrire ce programme dans le cadre d'exercices d'apprentissage du perl et je préférais m'en tenir à ce que nous avions déjà vu en cours, je bloquais juste sur l'articulation des boucles et des variables ^^'... Mais ça ne m'empêche pas d'aller plus loin avec ce que tu m'as dit :).
Encore merci, bon dimanche :)