Comment copier des chaînes de caractère différente
Fermé
am33450
Messages postés
20
Date d'inscription
vendredi 30 mars 2018
Statut
Membre
Dernière intervention
22 août 2018
-
Modifié le 30 mars 2018 à 15:47
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 5 avril 2018 à 14:03
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 5 avril 2018 à 14:03
A voir également:
- Comment copier des chaînes de caractère différente
- Caractère ascii - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Caractere speciaux - Guide
- Caractère spéciaux - Guide
- Comment copier une vidéo youtube - Guide
1 réponse
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
3 avril 2018 à 18:51
3 avril 2018 à 18:51
Salut am33450,
La regexp
Dal
La regexp
([A-Z0-9 ]{6})permet de matcher un groupe de 6 caractères consécutifs, composés de lettres majuscules, de chiffres ou d'espaces.
Dal
4 avril 2018 à 08:59
Merci !
Pour l'instant avec mon programme, lorsque je rencontre une chaîne de 6 caractères dans mon fichier 1, je copie toute la ligne dans un fichier 2 (donc des informations inutiles).
Or j'aimerai seulement copier cette chaîne de caractère (le nom des isotopes) et faire ça à chaque fois que mon programme en trouve dans mon fichier 1 :
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
Sais-tu comment je pourrais faire ? Si tu as un exemple je suis preneur !
Merci d'avance,
Am
4 avril 2018 à 10:18
Bref, si on ajoute l'underscore aux caractères permis et que l'on reste sur 6 caractères, tu peux utiliser la regexp pour extraire ce qui t'intéresse :
qui donne à l'exécution :
La variable $1 permet d'accéder au contenu capturé correspondant aux parenthèses de la regexp (si la regexp était composée de plusieurs expressions entre parenthèses, les autres captures seraient accessibles avec $2, $3, etc.).
Si tes données commencent systématiquement en début de ligne, tu peux affiner la regexp pour qu'elle ne matche qu'en début de ligne :
Dal
4 avril 2018 à 13:30
Oui en effet, il y a 6 caractères dans [ 72 ] car je compte l'espace à la fin.
______________________________________________________________________________________
Mon code est pour l'instant comme ça :
#!/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 fait je lis deux fichiers résultats dont le formalisme d'écriture est différent. Donc d'abord je les mets dans le même formalisme (en remplaçant les "_" par des espaces etc) puis j'aimerai copier tout les noms d'isotopes que je rencontre dans ces fichiers résultat dans un troisième fichier.
Or pour l'instant je n'arrives qu'à copier des lignes. Donc au final j'ai testé de créer un quatrième fichier dans lequel (grâce à ce que tu m'as montré précédemment) je récupère les chaines de 6 caractères composés de d'espace, lettres et chiffres.
Jusque là les 2 problèmes qu'il me reste sont :
-les fichiers résultats ne contiennent pas que des noms d'isotopes donc j'ai parfois des mots (de 6 caractères) qui sont copiés
-si j'ai plusieurs noms d'isotope sur une même ligne, seul le premier est copié.
Voici un extrait des fichiers que j'utilise :
Fichier f1 :
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
Fichier f2 :
--------------------------
| ISOTOPE | INITIALE |
--------------------------
| H 1 | 2.033043e+23 |
| H 2 | 3.050022e+19 |
| B 10 | 4.401455e+21 |
| B 11 | 1.771641e+22 |
Le script me donne pour l'instant :
Fichier "fichier.txt" :
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
eG CU_71 3.4182E+11 0.0000E+00 3.4182E+11
| H 1 | 2.033043e+23 |
| H 2 | 3.050022e+19 |
| B 10 | 4.401455e+21 |
| B 11 | 1.771641e+22 |
Fichier "iso.txt" :
LIST
H 3
BK246
H
C
G CU
H 1
H 2
B 10
B 11
Et moi je voudrais arriver à :
H 3
C 14
TH233
U239
NP236F
NP236M
AM242M
CM243
BK246
BK250
CF251
CF253
TL207M
FR224
CF246
CU 71
H 3
C 14
CU
H 1
H 2
B 10
B 11
J'espère que je suis clair ...
Merci d'avance
4 avril 2018 à 15:23
Fichier f1 :
Fichier f2 :
et ce que tu veux obtenir :
C'est bien ces formats ?
Dans le fichier 1, ce sont des espaces ou des tabulations qui séparent les données ?
Lorsque tu postes du code, ou du texte formaté avec des espaces, utilise la balise "code" du forum pour que cela s'affiche correctement, sinon le HTML écrase les espaces (pour récupérer ce format, j'ai dû afficher le code source de la page web du forum).
pour retirer les dupliqués, le mieux est de mettre les données capturées dans un tableau Perl pour les traiter - il y cependant différentes possibilités - la préservation de l'ordre d'apparition est-il important ?
Dal
5 avril 2018 à 14:03
tel que je vois le contenu de f1, après la ligne "LISTE ORDONNEE DES ISOTOPES :", les items à capturer sont séparés par 3 caractères espace, y compris le dernier de chaque ligne.
Si tel est le cas, le code suivant capture le contenu des fichiers f1 et f2, met les items en tant que clefs d'un hash pour s'assurer qu'ils sont uniques, et affiche les clefs en ordre alphabétique
donne :
Si tu as des questions sur le code, n'hésites pas à les poser.
Dal