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 05/12/2012, 15h35   #1
hajarita
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : janvier 2012
Messages : 49
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant
Secteur : Services à domicile

Informations forums :
Inscription : janvier 2012
Messages : 49
Points : 12
Points : 12
Par défaut expressions regulieres en perl

Bonjour,

je veux parse un fichier csv ou les champs sont separer par \t avec les expressions regulieres, mais j'ai un probleme avec un champs.

Voila un exemple de ligne que jèai dans mon fichier:


AAGASWIQFDEPLLVMDLDSHK 3 AAGASWIQFDEPLLVM[Oxidation (M)]DLDSHK 0 0

AAFDEAEK 2 0 0 0

je parse comme suite:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
 
while (<F>){
		if ($_ =~/^(\w+)\t(\d+)\t(\w+)\t(\d+)\t*/){
		$sequence = "$1";
		$charge = "$2";
		$modification = "$3";
 
		print OUT "$sequence\t$charge\t$modification\n";
	}
}
Mon probleme c'est que j'arrive pas à recupere jute le champs modification, car ce champs parfois j'ai un truc comme cela :
AAGASWIQFDEPLLVM[Oxidation (M)]DLDS
parfois
AAGASWIQFDEPLLVM
et parfois j'ai rien
hajarita est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2012, 16h21   #2
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 501
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 501
Points : 684
Points : 684
Envoyer un message via ICQ à Gardyen
ce n'est pas plus simple d'utiliser split ?
Code :
1
2
3
4
5
while (<IN>){
	chomp;
	my ($sequence, $charge, $modification) = split /\t/;
	print "$sequence\t$charge\t$modification\n";
}
avec juste un test sur l'une des valeurs si besoin est
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2012, 17h42   #3
elvivo
Membre régulier
 
Avatar de elvivo
 
Inscription : mai 2002
Messages : 105
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 105
Points : 71
Points : 71
Sinon pour repondre a la question initiale, ta regex matche le 3e champ par \t(\w+)\t, or dans ton example, AAGASWIQFDEPLLVM[Oxidation (M)]DLDSHK ne contient pas que des \w. Il y a les [] et les () qui empeche la regex de fonctionner.

Mais je suis d'accord avec Gardyen. Un split sera plus simple si tu es certain que les champs ne peuvent pas contenir le separateur.
__________________
In code we trust !!
elvivo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2012, 18h44   #4
hajarita
Candidat au titre de Membre du Club
 
Femme
Étudiant
Inscription : janvier 2012
Messages : 49
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant
Secteur : Services à domicile

Informations forums :
Inscription : janvier 2012
Messages : 49
Points : 12
Points : 12
Oui C plus simple!!!

Merci
hajarita est dé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 23h39.


 
 
 
 
Partenaires

Hébergement Web