REGEX supprimer un caractère dans une sous chaine

Fermé
kiligg - 8 juin 2015 à 18:00
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 1 juil. 2015 à 14:33
Bonjour,


Bonjour j'ai un fichier avec plusieurs lignes de ce type :

"230000034098|""PT.RLT.1/40T|2/50T|1/100T|2/25""|21530000||||0.00||104808.70|1996|01/01/1998||||||IS01705910||62330||LINR|10|2013|0|-104808.7|T001"

Le pipe (|) est un séparateur que je ne dois pas supprimer.

Je souhaiterai supprimer uniquement les pipes (|) qui sont compris entre les doubles guillemets, ici en l'occurrence j'aimerai avoir:
"230000034098|""PT.RLT.1/40T2/50T1/100T2/25""|21530000||||0.00||104808.70|1996|01/01/1998||||||IS01705910||62330||LINR|10|2013|0|-104808.7|T001"

J'aimerai ensuite supprimer tous les guillemets de ma ligne.

Est il possible de le faire sans reconstruire un nouveau fichier, juste en parcourant mon fichier déjà ouvert ?

Je débute en PERL, je trouve ce que j'ai à faire assez complexe, je ne sais même pas si c'est possible, je vous remercie de votre aide.

A voir également:

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 1/07/2015 à 14:35
Salut kiligg,

J'ignore si tu as toujours ce problème.

Il manque certaines précisions pour être sûr de ce que tu veux faire, mais voilà un exemple de code et de regexp qui altère ta ligne d'exemple de la façon que tu souhaites dans ton exemple.

#!/usr/bin/perl

use strict;
use warnings;

my $st = qq("230000034098|""PT.RLT.1/40T|2/50T|1/100T|2/25""|21530000||||0.00||104808.70|1996|01/01/1998||||||IS01705910||62330||LINR|10|2013|0|-104808.7|T001");

while ($st =~ /(.*"".*?)(\|)(.*?"".*)/)
{
    $st = $1 . $3;
}
print "Résultat :\n" . $st . "\n";

donne :
Résultat :
"230000034098|""PT.RLT.1/40T2/50T1/100T2/25""|21530000||||0.00||104808.70|1996|01/01/1998||||||IS01705910||62330||LINR|10|2013|0|-104808.7|T001"

La regexp boucle sur une ligne tant qu'il y a des doubles guillemets avec au moins un pipe dedans, et les retire un à un en concaténant ce qui est avant et après le pipe. Les spécificateurs .*? non gourmands sont utilisés pour le cas où il y a plusieurs données entre doubles guillemets dans une ligne.

Si cela te va, tu peux adapter ce code pour traiter ainsi toutes tes lignes.

Il a sans doutes des façons plus optimisées de faire, mais c'est celle qui m'est venue à l'esprit en premier :-)

Dal
0