Bou c'est encore moi
J'arrive toujours pas à extraire une chaine entre 2 lignes
j'ai testé plein d'expressions regulieres et il y en a aucunes qui afonctionnée.
tout ce que je sais s'est qu'il faut utiliser l'option \s.
Bou c'est encore moi
J'arrive toujours pas à extraire une chaine entre 2 lignes
j'ai testé plein d'expressions regulieres et il y en a aucunes qui afonctionnée.
tout ce que je sais s'est qu'il faut utiliser l'option \s.
Quand tu parle d'une chaine entre deux lignes, s'agit il :
1) D'une chaine complète isolée entre deux lignes connues, comme ceci2) D'une chaine qui s'étend sur plusieurs lignes comme ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 marqueur début Ligne voulue marqueur fin
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Texte à récupérer dans son intégralité
La FAQ Perl est par ici
: La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !
Une chaine comme celle ci par exemple
As tu une idée de quelles regex utiliser?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 marqueur début Ligne voulue marqueur fin
donne un exemple de fichier avec tes lines à extraire! je testerai
- Les meilleurs cours et tutoriels Perl et Perl 6 pour vous former ;
- FAQ Perl, Perl 6 et Perl/Tk d'entraide ;
- Les news sur la rubrique Perl ;
- S'abonner au compte Twitter de la rubrique Perl ;
- Mes tutoriels developpez.com.
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
Mais voilà:
Ça donne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 my $s = <<EOT; marqueur debut Ligne voulue marqueur fin EOT $s =~ /marqueur debut(.*?)marqueur fin/s; print $1;
Ligne voulue
voici un exemple de texte :
Ta solution pourrai marcher dmitry_ovsianko, si seulement je connaissais "ligne voulu".Problem description
Tout est planté
Problem Resolution
Plus rien n'est planté
Opened by ....
Je cherche à extraire les lignes en gras, le probleme c'est que ces lignes voulu sont aléatoires, le message en gras a la possiibilité de changer.
donne
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 use Data::Dumper; my $s = <<EOT; Problem description Tout est plante Problem Resolution Plus rien n'est plante EOT my @paragraphes = split /\n\n/s, $s; map {s{.*?\n}{}sm} @paragraphes; print Dumper (\@paragraphes);
$VAR1 = [
'Tout est plante ',
'Plus rien n\'est plante '
];
Je ne comprend pas tres bien ton code.
je ne connais pas le module Dumper, à quoi il correspond?
voila mon code
j'ai esseyé avec cette expression réguliere mais rien n'y fait, ça me renvois rien.
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 #!/usr/bin/perl -w use strict; my ( @description, $fav) ; $fav = "toto.txt"; open AVANT, $fav or die "Impossible d'ouvrir $fav\n"; while (<AVANT>) { #recherche de la description de la demande de la demande push @description, $2 if m/^(Problem Description\s+)(.+?)(\s+Problem Resolution)/; } print ("\n @description \n"); close AVANT;
Data:umper -- c'est seulement pour afficher la structure de donne/es (tableau).
Ton pb est ce que tu lis ton fichier ligne-par-ligne et veux en même temps utiliser des regexp multi-lignes.
Ils sont gros tes fichiers?
Si oui, écrivons un script ligne-par-ligne sans regexp.
Sinon, avalons tout son contenu en une ligne et puis le déсoupons avec des regexp.
Mon fichier fait une 30aines de lignes.
J'ai 5 chaine a récupérer dans ce fichiers.
3 se trouve en fin de ligne, pour celles là pas de problemes j'ai reussi à les récupérer avec de l'aide.
pour les 2 autres, elles se trouvent sur des lignes entieres, j'avais aussi envisager comme solution de supprimer les retours à la ligne entre ces lignes que je n'arrive pas à extraire, mais bon j'ai un peu de mal à mettre cela en place.
Pour un petit fichier il est bien commode de le charger entièrement avec
et puis le traîter avec des RegExp.
Code : Sélectionner tout - Visualiser dans une fenêtre à part my $tout = join '', (<AVANT>);
je vais esseyer ça merci.
mais quel serai l'expression reguliere à utiliser dans ce cas là, pour prendre une chaine entre plusieures chaines?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 my $tout = <<EOT; Problem description Tout est plante Et ca va bien Problem Resolution Plus rien n'est plante EOT $tout =~ /Problem description\n(.*?)\n\nProblem Resolution/s; print $1;Tout est plante
et en enlevant la partie EOT, je ne pourrai pas faire quelque chose du genre:
vu que j'ouvre mon fichier avant, il va lire directement dedant
Code : Sélectionner tout - Visualiser dans une fenêtre à part push @description, $1 if /Problem Description(.*?)Problem Resolution/s;
C'est
qui remplace la partie EOT.
Code : Sélectionner tout - Visualiser dans une fenêtre à part my $tout = join '', (<AVANT>);
mince ça n'a pas l'air de marcher
le join est à mettre avant la boucle whileet apres le open non?
ça ne me renvois rien
bouuu
peu etre que je m'y prend mal mais ça ne marche pas .
la syntaxe du programme c'est bien
ouverture du fichier
le join
le push
et le print?
Salut,
poste ton code ça ira plus vite
Salut,
Je me demande dans quelle mesure un petit retour par l'étape algorithmique/formalisation du traitement ne pourrait pas aider à résoudre ce problème.
Peut être que concevoir une bête machine à états serait plus efficace que de construire une monstrueuse expression rationnelle qui fait tout (sauf le café, parce que ça, c'est un boulôt pour Java ) et qui n'est pas facile à maintenir ...
Est-ce qu'une conception comme celle-ci peut te convenir (vite codée, je n'ai pas fait trop attention à tous les cas, mes variables, etc.) ?
Comme tu vois, il est facile d'ajouter d'autres cas, voire d'utiliser des tableaux différents pour les différentes catégories de messages ...
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 #!/usr/bin/perl -w use strict; my ( @description, $fav) ; $fav = "./texte.txt"; open AVANT, "<".$fav or die "Impossible d'ouvrir $fav\n"; my $encours = ""; while (<AVANT>) { chomp ($_); print $_."\n"; if ( /^Problem Description/ ) { push (@description, $encours) if ($encours ne ""); $_ = $encours = ""; } if ( /^Problem Resolution/ ) { push (@description, $encours) if ($encours ne ""); $_ = $encours = ""; } $encours .= $_."\n"; } close AVANT; if ($encours ne "") { push (@description, $encours); } foreach (@description) { print ("-> $_\n"); }
Bonne continuation
La FAQ Perl est par ici
: La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager