Perl expressions régulières

[Résolu/Fermé]
Signaler
Messages postés
39
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
15 septembre 2013
-
Messages postés
39
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
15 septembre 2013
-
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";
}

1 réponse

Messages postés
39
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
15 septembre 2013
1
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";
}