Identifier caractère qui suit un "_" et ledéplacer [Fermé]

Signaler
Messages postés
20
Date d'inscription
vendredi 30 mars 2018
Statut
Membre
Dernière intervention
22 août 2018
-
Messages postés
15925
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 mai 2021
-
Bonjour à tous !

Nouveau en Perl, je rencontre une petite difficulté. Dans un fichier texte, je voudrais faire la modification suivante :

Lorsqu'en lisant le fichier lignes par lignes je tombe sur un underscore ("_") je voudrais faire une boucle permettant d'analyser le caractère qui se situe à droite du "_". Si c'est une lettre, le déplacer sur la position où se trouvait l'underscore en laissant un espace à l'ancienne place de cette lettre. Si c'est un chiffre, simplement remplacer cet underscore par un espace.

Petit exemple, je voudrais que :
_H__1 CU_71
me donne :
H 1 CU 71

Connaissez-vous une fonction permettant d'analyser le type de caractère se trouvant à la droite d'un autre ?

Meci d'avance !

2 réponses

Messages postés
15925
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 mai 2021
701
Bonjour

regarde du coté des Regex, je ne sais pas si ça s'implémente en Perl, mais c'est un outil "universel" donc je pense que oui.

Petits exemples
http://regexstorm.net/tester?p=%28_%29%2b%28%3f%3d%5bA-Za-z%5d%29&i=Supprime+tout+_+avant+une+lettre%0d%0a_H__1+CU_71+___e+_Z&r=

La Regex est
(_)+(?=[A-Za-z])
et on remplace par du vide
(voir l'onglet Context pour le résultat)

http://regexstorm.net/tester?p=%28_%29%2b%28%3f%3d%5b0-9%5d%29&i=Supprime+tout+_+avant+une+lettre%0d%0a_H__1+CU_71+___e+_Z&r=+

La regex est
(_)+(?=[0-9])
et on remplace par l'espace


1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
20
Date d'inscription
vendredi 30 mars 2018
Statut
Membre
Dernière intervention
22 août 2018

Par exemple,
lorsque j'ai une ligne comme ça dans le fichier 1 :
eg CU_72 1.0045782E9
eg CU_73 1.0293612E9

J'aimerai obtenir dans un fichier 2 :
CU 72
CU 73
Messages postés
15925
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 mai 2021
701
Je n’arrive pas à comprendre ton exemple de 13:48 par rapport à la demande de 12:52, c’est 2 cas différents?
Messages postés
20
Date d'inscription
vendredi 30 mars 2018
Statut
Membre
Dernière intervention
22 août 2018

Non non c'était juste pour illustrer ce que j'ai expliquer à 12:52. C'est bien les mêmes cas. Mon problème est de savoir comment copier seulement une chaîne de caractère qui m’intéresse et non pas toute une ligne comme mon programme le fait pour l'instant.

Merci d'avance de tes conseils
Messages postés
15925
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 mai 2021
701
Afin de répondre au mieux, peux tu me donner les cas que tu trouves avec les sorties attendues de façon la plus exhaustive possible?
Merci
Messages postés
20
Date d'inscription
vendredi 30 mars 2018
Statut
Membre
Dernière intervention
22 août 2018

En gros, j'ai un fichier 1 tel que :

LISTE ORDONNEE DES ISOTOPES :
H 3 C 14 TH233 U239 NP236F NP236M AM242M CM243
BK246 BK250 CF251 CF253 TL207M FR224 CF246 CU 71

_H__3 1.0392E+13 0.0000E+00 1.0392E+13
_C_14 2.6451E+08 0.0000E+00 2.6451E+08

Et j'aimerais obtenir à l'arriver un deuxième fichier tel que :

H 3
C 14
TH233
U 239
NP236F
NP236M
AM242M
CM243
BK246
BK250
CF251
CF253
TL207M
FR224
CF246
CU 71
H 3
C 14

Et pour l'instant avec le programme que j'ai fait je trouve :

LISTE
H 3
BK246
H 3
C 14




Voici mon programme :


#!/usr/bin/perl
# =============================================================================
# Imports
# =============================================================================
use strict;
use warnings;
use autodie;


open (FICHIER, ">fichier.txt") || die ("Vous ne pouvez pas créer le fichier \"fichier.txt\"");
open(F,"f1") || die ("Erreur d'ouverture du fichier f1") ;
print FICHIER "Darwin \n";
my $mot = "";
while (<F>) {
$_ =~ s/\n//g;
if ($_ =~ / \w\w\w\w\w(\w| )/){
$_ =~ s/(_)+(?=[A-Za-z])//g;
$_ =~ s/(___)+(?=[0-9])/ /g;
$_ =~ s/(__)+(?=[0-9])/ /g;
$_ =~ s/(_)+(?=[0-9])/ /g;
$mot = $_;
print FICHIER $mot;
print FICHIER "\n";
}
}
close (F);
print FICHIER "Cesar \n";
open(F,"f2") || die ("Erreur d'ouverture du fichier f2") ;
while (<F>) {
$_ =~ s/\n//g;
if ($_ =~ / \w(\w| )(\w| )(\w| )\w(\w| )/){
$_ =~ s/(_)+(?=[A-Za-z])//g;
$_ =~ s/(___)+(?=[0-9])/ /g;
$_ =~ s/(__)+(?=[0-9])/ /g;
$_ =~ s/(_)+(?=[0-9])/ /g;
$mot = $_;
my @tab = ();
print FICHIER $_;
print FICHIER "\n";
}
}
close (F);
close (FICHIER);
open (FICHIER, "fichier.txt") || die ("Vous ne pouvez pas créer le fichier \"fichier.txt\"");
open (FIC, ">iso.txt") || die ("Vous ne pouvez pas créer le fichier \"fichier.txt\"");
while (<FICHIER>) {
if ($_ =~ /([A-Z0-9 ]{6})/){
my $match = $1;
print FIC "$match\n";
}
}
close (FICHIER);
close (FIC);

__________________________________

En espérant avoir été clair.

Merci
Messages postés
15925
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 mai 2021
701
Pour extraire les isotopes
([A-Z]{1,2})(( *)|(_*))(\d+[A-Z]?)

Exemple, voir l'onglet table
http://regexstorm.net/tester?p=%28%5bA-Z%5d%7b1%2c2%7d%29%28%28+*%29%7c%28_*%29%29%28%5cd%2b%5bA-Z%5d%3f%29&i=H+3+C+14+TH233+U239+NP236F+NP236M+AM242M+CM243+%0d%0aBK246+BK250+CF251+CF253+TL207M+FR224+CF246+CU+71+%0d%0a%0d%0a_H__3+1.0392E%2b13+0.0000E%2b00+1.0392E%2b13+%0d%0a_C_14+2.6451E%2b08+0.0000E%2b00+2.6451E%2b08+


Après, tu énumères toutes les captures.
Pour chacune, il suffit de tester la longueur de $1,
  • si c'est 1 tu exportes $1 $2
  • si c'est 2 tu exportes $1$2