Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Langage
Langage Toutes vos questions sur les scripts Perl en général. Avant de poster, veuillez consulter les FAQs perl, les cours Perl, les critiques de livres et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/11/2012, 00h03   #1
africanwinners
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 93
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 93
Points : 34
Points : 34
Par défaut éliminer un caractère

bonsoir

J'ai fais un script qui permet d'éliminer le caractère _

mais le problème que malgré que j'ai fais un test pour ne pas éliminer le "_" quand dans la ligne il y a la chaine ".xml", ca ne marche pas et ca n'élimine plus les "_".

ex du fichier à traiter:
as_2001_000207ar.xml
économie_politique ;sujets_anthropologiques ;rapports_de_pouvoir
as_2001_000211ar.xml
hégémonie_familiale ;projet_familial
....

voila le code

Code :
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
 
 
#!/usr/bin/perl
 
print "bonjour\n";
open(FIC, $ARGV[0]);
 
 
print "choisis un nom de fichier de sortie\n";
 
my $fic2=<STDIN>;
open(FIC2, ">$fic2");
 
 
 
while (<FIC>) {
my $ligne=$_;
 
if ($ligne=~/.xml/){
 
print FIC2 $ligne;
 
}
else {
$ligne=~s/_/ /g;
print FIC2 $ligne;}
 
 
}
ca n'élimine pas les "_", je crois qu"il considère chaque deux lignes comme une seule ligne!!!

Merci
africanwinners est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 09h11   #2
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 634
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 634
Points : 3 080
Points : 3 080
Deux petites corrections qui ne devraient pas corriger votre problème, mais qui sont à mon sens indispensables :

=>
Code :
chomp(my $fic2=<STDIN>);
et

=>
Concernant ton soucis, le fichier à traiter a-t-il été généré sur le même système que celui où tu lances le script (exemple : windows et windows ou linux et linux) ?

Edit : en tout cas, chez moi, ton script fonctionne tel quel.
__________________
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Using strict and warnings is good for you.
Philou67430 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 11h41   #3
africanwinners
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 93
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 93
Points : 34
Points : 34
Bonjour

C'est pas moi qui a générer ce fichier, il a peut être été générer par un système linux!! et moi je travaille avec windows

C'est la première fois que j'ai ce genre de problème

J'attends votre aide, merci
africanwinners est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 11h47   #4
africanwinners
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 93
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 93
Points : 34
Points : 34
Pardon ce dernier fichier a été générer par windows
africanwinners est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 12h29   #5
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 569
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 569
Points : 1 119
Points : 1 119
Bonjour,

Essaie ceci:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/perl
use strict;
use warnings;
 
my $fichier = shift;
chomp $fichier;
print "bonjour\n";
open FIC, "<", $fichier or die "Impossible d'ouvrir le fichier $fichier $! \n";
 
print "choisis un nom de fichier de sortie\n";
 
my $fic2=<STDIN>;
chomp $fic2;
open FIC2, ">", $fic2 or die "Impossible d'ouvrir le fichier $fic2 $! \n";;
 
while (my $ligne =<FIC>) {
	if ($ligne =~ /\.xml/) {
		print FIC2 $ligne;
	}
	else {
		$ligne=~s/_/ /g;
		print FIC2 $ligne;
	} 
}
Avec les données suivante en entrée:

Code :
1
2
3
4
5
cat test_.txt
as_2001_000207ar.xml
économie_politique ;sujets_anthropologiques ;rapports_de_pouvoir
as_2001_000211ar.xml
hégémonie_familiale ;projet_familial
j'obtiens le fichier de sortie:

Code :
1
2
3
4
5
cat out.txt
as_2001_000207ar.xml
économie politique ;sujets anthropologiques ;rapports de pouvoir
as_2001_000211ar.xml
hégémonie familiale ;projet familial
La correction la plus importante est celle-ci:

Code :
if ($ligne =~ /\.xml/) {
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/11/2012, 12h49   #6
africanwinners
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 93
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 93
Points : 34
Points : 34
Merci pour votre aide si précieuse

j'ai reformulé mon programme
j'ai mis le fichier dans un tableau @a

ensuite j'ai testé au lieu de je sais pas pourquoi quand je fais le test sur \.xml ca remplace tous les "_"


alors
j'ai inversé le test sur le ; et ça marche

voila ma solution
Code :
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
 
print "bonjour\n";
open(FIC, $ARGV[0]);
 
  my @a = ();
 
 
print "choisis un nom de fichier\n";
 
chomp(my $fic2=<STDIN>);
open(FIC2, ">$fic2");
 
 
 
#---------------------------------------------------
# initialisation des variables
#---------------------------------------------------
 
 
 
 
 
 
$i=0;
 
while (<FIC>) {
my $ligne=$_;
 
$a[$i]=$ligne;
 
$i++;
}
 
foreach my $c(@a){
 
if ($c=~/;/){
$c=~s/_/ /g;
print FIC2 "$c";
}
else{
 
 
print FIC2 "$c";}
 
}
Merci à tous
africanwinners est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 13h15   #7
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 569
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 569
Points : 1 119
Points : 1 119
Citation:
Envoyé par africanwinners Voir le message

je sais pas pourquoi quand je fais le test sur \.xml ca remplace tous les "_"
Comme Philou et moi-même te l'avons signalé, le test correct est:

Code :
if ($ligne =~ /\.xml/) { # ...
Le point ayant une signification particulière dans une regex (caractère quelconque sauf saut de ligne), il faut le précéder d'un caractère d'échappement (le "\") pour reconnaître littéralement un point.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 13h45   #8
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 634
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 634
Points : 3 080
Points : 3 080
Cela dit, je répète que même sans les corrections proposées, le script proposé à l'origine fonctionnait sur ma plateforme.
__________________
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Using strict and warnings is good for you.
Philou67430 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h26.


 
 
 
 
Partenaires

Hébergement Web