Perl expressions régulières
Résolu
deniss92
Messages postés
39
Date d'inscription
Statut
Membre
Dernière intervention
-
deniss92 Messages postés 39 Date d'inscription Statut Membre Dernière intervention -
deniss92 Messages postés 39 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai un petit souci dans mon script avec les expressions régulières.
Dans le fichier à traites souvent les utilisateurs ont des erreur de saisi en oubliant un espace entre un article et le titre du document (voir extrait ci-dessous) :
000186207|LeTour du monde(Paris. 1860)||||0982-1651
000185630|LesIndicateurs du 7eme plan(Paris)||||0398-4419
000185203|LeMois en Afrique||||0294-8117
000184656|LesCahiers du Sud||||0184-752X
000185184|Lettre mensuelle regionale - Banque de France. Ile-de-France||||0294-0191
000185897|Les^Cahiers de la fonction publique et de l'administration||||0753-4418
000185899|Actualites Legislatives Dalloz||||0753-874X
000185900|LeJournal de Chaillot(1974)||||0753-9231
000184746|L?Education nationale(Paris)||||0223-3029
000184083|Les^Temps modernes||||0040-3075
J'ai fait mon script pour ajouter un espace entre l'article et le tritre et éventullement corriger les erreurs de saisi comme dans "L?Education nationale". Tout se passe bien lorsqu'il s'agit d'un "L'", mais lorsqu'il s'agit de "Le" ou "Les" ou "La" mon script ne fonctionne plus car "Lettre mensuelle regionale" devient "Le ttre mensuelle regionale" par exemple.
Si j'arrive à tester la présence du caractère en majuscle, qui suit l'article,dans l'expression réguilière, je devrais y arriver. Mais je ne suis assez bon en expressions régulières
Merci d'avance, si quelqu'un à une idée.
A bientôt
Voici le script
#!/usr/bin/perl
use strict;
use warnings;
use Text::Iconv;
my $converter = Text::Iconv->new("ISO-8859-1","UTF-8");
my (@tmp,@tab, $notice, $titre,$articles,$isbn);
chdir('/home/Perl') || die ("Erreur chdir \n");
open FILE,"export.dat" or die "E/S : $!\n";
open RES,">import.txt" or die "E/S : $!\n";
while (<FILE>){
chomp;
@tmp=split(/\|/,$_);
$notice = $tmp[0];
$titre = $tmp[1];
$titre = $converter->convert($titre);
$titre =~ s/^\s+|\s+$//g; #suppression des espaces (debut et fin)
$titre =~ s/^(L(\pP)|L\')/L\' /gi;
$titre =~ s/^(La|The|Il|Les?)/$1 /gi;
$titre =~ s/\^/ /g;# remplacement du caractère "^" et des espaces et tabulations par 1 seul espace
$isbn =$tmp[5];
$_=join (";",$notice,$titre,$isbn);
push (@tab,$_);
}
foreach (@tab){
chomp (@tab);
print RES $_."\n";
}
J'ai un petit souci dans mon script avec les expressions régulières.
Dans le fichier à traites souvent les utilisateurs ont des erreur de saisi en oubliant un espace entre un article et le titre du document (voir extrait ci-dessous) :
000186207|LeTour du monde(Paris. 1860)||||0982-1651
000185630|LesIndicateurs du 7eme plan(Paris)||||0398-4419
000185203|LeMois en Afrique||||0294-8117
000184656|LesCahiers du Sud||||0184-752X
000185184|Lettre mensuelle regionale - Banque de France. Ile-de-France||||0294-0191
000185897|Les^Cahiers de la fonction publique et de l'administration||||0753-4418
000185899|Actualites Legislatives Dalloz||||0753-874X
000185900|LeJournal de Chaillot(1974)||||0753-9231
000184746|L?Education nationale(Paris)||||0223-3029
000184083|Les^Temps modernes||||0040-3075
J'ai fait mon script pour ajouter un espace entre l'article et le tritre et éventullement corriger les erreurs de saisi comme dans "L?Education nationale". Tout se passe bien lorsqu'il s'agit d'un "L'", mais lorsqu'il s'agit de "Le" ou "Les" ou "La" mon script ne fonctionne plus car "Lettre mensuelle regionale" devient "Le ttre mensuelle regionale" par exemple.
Si j'arrive à tester la présence du caractère en majuscle, qui suit l'article,dans l'expression réguilière, je devrais y arriver. Mais je ne suis assez bon en expressions régulières
Merci d'avance, si quelqu'un à une idée.
A bientôt
Voici le script
#!/usr/bin/perl
use strict;
use warnings;
use Text::Iconv;
my $converter = Text::Iconv->new("ISO-8859-1","UTF-8");
my (@tmp,@tab, $notice, $titre,$articles,$isbn);
chdir('/home/Perl') || die ("Erreur chdir \n");
open FILE,"export.dat" or die "E/S : $!\n";
open RES,">import.txt" or die "E/S : $!\n";
while (<FILE>){
chomp;
@tmp=split(/\|/,$_);
$notice = $tmp[0];
$titre = $tmp[1];
$titre = $converter->convert($titre);
$titre =~ s/^\s+|\s+$//g; #suppression des espaces (debut et fin)
$titre =~ s/^(L(\pP)|L\')/L\' /gi;
$titre =~ s/^(La|The|Il|Les?)/$1 /gi;
$titre =~ s/\^/ /g;# remplacement du caractère "^" et des espaces et tabulations par 1 seul espace
$isbn =$tmp[5];
$_=join (";",$notice,$titre,$isbn);
push (@tab,$_);
}
foreach (@tab){
chomp (@tab);
print RES $_."\n";
}
A voir également:
- Perl expressions régulières
- Denon perl pro test - Accueil - Audio
- Active perl - Télécharger - Édition & Programmation
- Expressions régulières "ne contient pas ..." ✓ - Forum Programmation
- Expressions francaises - Forum Études / Formation High-Tech
- Perl exec - Forum Perl
1 réponse
Bonjour,
J'ai ajouté les conditions ci-dessous et ça l'air de fonctionner
if ($titre =~/^(Les?)([A-Z])/){
$titre=~s/^(Les?)/$1 /gi;
}
if ($titre =~/^(La)([A-Z])/){
$titre=~s/^(La)/La /gi;
}
.....
c'est pas propre, mais ça résoud mon problème.
Voici le script final, mais je sais qu'il ya mieux.
#!/usr/bin/perl
use strict;
use warnings;
use Text::Iconv;
my $converter = Text::Iconv->new("ISO-8859-1","UTF-8");
my (@tmp,@tab, $notice, $titre,$articles,$isbn);
chdir('/home/Perl') || die ("Erreur chdir \n");
open FILE,"export.dat" or die "E/S : $!\n";
open RES,">import.txt" or die "E/S : $!\n";
while (<FILE>){
chomp;
@tmp=split(/\|/,$_);
$notice = $tmp[0];
$titre = $tmp[1];
$titre = $converter->convert($titre);
$titre =~ s/^\s+|\s+$//g; #suppression des espaces (debut et fin)
$titre =~ s/^(L(\pP)|L\')/L\' /gi;
if ($titre =~/^(Les?)([A-Z])/){
$titre=~s/^(Les?)/$1 /gi;
}
if ($titre =~/^(La)([A-Z])/){
$titre=~s/^(La)/La /gi;
}
if ($titre =~/^(The)([A-Z])/){
$titre=~s/^(The)/The /gi;
}
$titre =~ s/\^/ /g;# remplacement du caractère "^" et des espaces et tabulations par 1 seul espace
$titre =~ s/(\s+|\t)/ /g;# remplacement trop d' espaces et tabulations par 1 seul espace
$isbn =$tmp[5];
$_=join (";",$notice,$titre,$isbn);
push (@tab,$_);
}
foreach (@tab){
chomp (@tab);
print RES $_."\n";
}
J'ai ajouté les conditions ci-dessous et ça l'air de fonctionner
if ($titre =~/^(Les?)([A-Z])/){
$titre=~s/^(Les?)/$1 /gi;
}
if ($titre =~/^(La)([A-Z])/){
$titre=~s/^(La)/La /gi;
}
.....
c'est pas propre, mais ça résoud mon problème.
Voici le script final, mais je sais qu'il ya mieux.
#!/usr/bin/perl
use strict;
use warnings;
use Text::Iconv;
my $converter = Text::Iconv->new("ISO-8859-1","UTF-8");
my (@tmp,@tab, $notice, $titre,$articles,$isbn);
chdir('/home/Perl') || die ("Erreur chdir \n");
open FILE,"export.dat" or die "E/S : $!\n";
open RES,">import.txt" or die "E/S : $!\n";
while (<FILE>){
chomp;
@tmp=split(/\|/,$_);
$notice = $tmp[0];
$titre = $tmp[1];
$titre = $converter->convert($titre);
$titre =~ s/^\s+|\s+$//g; #suppression des espaces (debut et fin)
$titre =~ s/^(L(\pP)|L\')/L\' /gi;
if ($titre =~/^(Les?)([A-Z])/){
$titre=~s/^(Les?)/$1 /gi;
}
if ($titre =~/^(La)([A-Z])/){
$titre=~s/^(La)/La /gi;
}
if ($titre =~/^(The)([A-Z])/){
$titre=~s/^(The)/The /gi;
}
$titre =~ s/\^/ /g;# remplacement du caractère "^" et des espaces et tabulations par 1 seul espace
$titre =~ s/(\s+|\t)/ /g;# remplacement trop d' espaces et tabulations par 1 seul espace
$isbn =$tmp[5];
$_=join (";",$notice,$titre,$isbn);
push (@tab,$_);
}
foreach (@tab){
chomp (@tab);
print RES $_."\n";
}