IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Suppression de caractères "pourris" en debut de chaine


Sujet :

Langage Perl

  1. #1
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut Suppression de caractères "pourris" en debut de chaine
    Bonjour à tous ,

    Comme dit dans le titre je cherche à supprimer des caractères "pourris" situés en début de chaine de caractère , celle-ci ci doivent commencer par 2018 ;

    voici un panel de lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ÿÿÿÿMD  2018/11/06 18:07:49|MET|58|1|2018/11/06 18:31:14|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#00008568872009|89
    2018/11/06 18:10:14|59|1|1|2|0|25|7|0|0|||2|-1|518554|597776|2907|3007|0|00
    Í%ÿÿÿÿMD  2018/11/06 18:10:30|1|1|2|0|25|7|0|0|2018/11/07 18:32:14||2|-1|518554|597776|2907|3007|0|cf
    &ÿÿÿÿMD  2018/11/06 18:15:30|MET|58|1|1|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#000085688
    42018/11/06 18:24:26|MET|58|1|1|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#00008828
    IÿÿÿÿMD  2018/11/06 18:25:17|1|1|2|0|25|7|0|0|||2|-1|518554|597776|2907|3007|0|cf
    F2018/11/06 18:30:57|1|2|0|25|7|0|0|||2|-1|518554|597776|29|1|2|0|25|7|0|0|||2|-1|518554|597776|29
    wL^ÿÿÿÿMD  2018/11/06 18:31:14|1|2|0|25|7|0|0||2018/11/06 18:31:14|2|-1|518554|597776|29
    n2018/11/06 18:45:34|1|1|2|0|25|7|0|0|||2|-1|518554|597776|2907|3007|0|cf
    AQRH2018/11/06 19:17:23|1|2|0|25|7|0|0|||2|-1|518554|597776|297|0|0|0
    J'ai essayé plusieurs regex par substitution , mais rien ne marche ... (évidement une date peut se retrouver ailleurs dans la chaine )

    Merci pour votre aide

    A+

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'2018' '{OFS=FS;$1="";} 1' fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's@[0-9]\{4\}/[0-9][0-9]/[0-9][0-9]@\n&@;s@.*\n@@' fichier

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 3 612
    Billets dans le blog
    1
    Par défaut
    Comme c'est la rubrique Perl de ce forum, une solution en Perl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    s/.+?2018/2018/;  # remplace tous les caractères du début de la chaîne jusqu'à 2018 (inclus) par 2018
    Exemple d'utilisation à la ligne de commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $ echo 'ÿÿÿÿMD  2018/11/06 18:07:49|MET|58|1|2018/11/06 18:31:14|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#00008568872009|89
    > 2018/11/06 18:10:14|59|1|1|2|0|25|7|0|0|||2|-1|518554|597776|2907|3007|0|00
    > Í%ÿÿÿÿMD  2018/11/06 18:10:30|1|1|2|0|25|7|0|0|2018/11/07 18:32:14||2|-1|518554|597776|2907|3007|0|cf
    > &ÿÿÿÿMD  2018/11/06 18:15:30|MET|58|1|1|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#000085688
    > 42018/11/06 18:24:26|MET|58|1|1|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#000088
    > ' | perl -pe 's/.+?2018/2018/;
    > '
    2018/11/06 18:07:49|MET|58|1|2018/11/06 18:31:14|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#00008568872009|89
    2018/11/06 18:10:14|59|1|1|2|0|25|7|0|0|||2|-1|518554|597776|2907|3007|0|00
    2018/11/06 18:10:30|1|1|2|0|25|7|0|0|2018/11/07 18:32:14||2|-1|518554|597776|2907|3007|0|cf
    2018/11/06 18:15:30|MET|58|1|1|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#000085688
    2018/11/06 18:24:26|MET|58|1|1|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#000088

  4. #4
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Comme c'est la rubrique Perl de ce forum, une solution en Perl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    s/.+?2018/2018/;  # remplace tous les caractères du début de la chaîne jusqu'à 2018 (inclus) par 2018
    si seulement cela avait été aussi simple , une des nombreuses tentatives que j'ai testé , mais ça ne marche pas , ces p... de caractères se sont insérés à la place d'un retour chariot , c'est certainement un pb d'encodage caractère mais rien n'y fait.

    A force de tourner en rond , j'ai fait un split /2018/ de la chaine de caractère , et chose bizarre , quand je veux afficher la première valeur de la table c'est vide ???

    Mais au moins en faisant comme ça je peux récupérer ce dont j'ai besoin

    Ceci dit , si quelqu'un a une autre solution ou explication , je suis preneur ...

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    la solution idéale serait certainement de résoudre le problème d'encodage. Mais là, impossible de t'aider, tu ne donnes pas assez d'informations sur tes données en entrée.

    Si supprimer les caractères précédant la chaîne 2018 ne fonctionne pas dans tous les cas, tu peux choisir une stratégie inverse: ne garder que les caractères suivant la chaîne 2018 (et n'imprimer le résultat que si la chaîne 2018 a été trouvée). Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $ echo 'ÿÿÿÿMD  2018/11/06 18:07:49|MET|58|1|2018/11/06 18:31:14|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#00008
    568872009|89
    > 2018/11/06 18:10:14|59|1|1|2|0|25|7|0|0|||2|-1|518554|597776|2907|3007|0|00
    > Í%ÿÿÿÿMD  2018/11/06 18:10:30|1|1|2|0|25|7|0|0|2018/11/07 18:32:14||2|-1|518554|597776|2907|3007|0|cf
    > &ÿÿÿÿMD  2018/11/06 18:15:30|MET|58|1|1|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#000085688
    > 42018/11/06 18:24:26|MET|58|1|1|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#000088
    > '  |  perl -ne 'print "$1\n" if /(2018.+$)/;
    > '
    2018/11/06 18:07:49|MET|58|1|2018/11/06 18:31:14|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#00008568872009|89
    2018/11/06 18:10:14|59|1|1|2|0|25|7|0|0|||2|-1|518554|597776|2907|3007|0|00
    2018/11/06 18:10:30|1|1|2|0|25|7|0|0|2018/11/07 18:32:14||2|-1|518554|597776|2907|3007|0|cf
    2018/11/06 18:15:30|MET|58|1|1|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#000085688
    2018/11/06 18:24:26|MET|58|1|1|1|0|25|6|0|0|#BSLIL656#DSCAN117!10!atm!1/46:8.35#000088

  6. #6
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Bonjour,

    la solution idéale serait certainement de résoudre le problème d'encodage. Mais là, impossible de t'aider, tu ne donnes pas assez d'informations sur tes données en entrée.
    Malheureusement , comme les fichiers sont reçus par CFT , je ne sais pas quel est le type d'encodage !!

    Citation Envoyé par Lolo78 Voir le message
    > ' | perl -ne 'print "$1\n" if /(2018.+$)/;
    > '
    Déjà essayé aussi , mais ça ne vire pas les caractères ....

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 342
    Par défaut
    Comment traites-tu l'appel par perl ?
    ou

  8. #8
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 3 612
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par olivier1969 Voir le message
    Déjà essayé aussi , mais ça ne vire pas les caractères ....
    Je ne vois pas comment c'est possible.

    Peux-tu donner le code de ton programme faisant cela et ne supprimant les caractères avant le 2018?

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 342
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Je ne vois pas comment c'est possible.

    Peux-tu donner le code de ton programme faisant cela et ne supprimant les caractères avant le 2018?
    Un cas possible, c'est qu'il passe par un pipe d'une commande et qu'en fait, les message sont sortie sur le canal d'erreur et donc ne passe pas du tout par perl, d'où ma question...

  10. #10
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    Utiliser s/.+?2018/2018/ risque d'effacer une bonne partie de ligne si celle-ci n'a pas de caractères "pourris" au début mais contient une deuxième occurrence de "2018". Mieux vaut remplacer + par *.

  11. #11
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 3 612
    Billets dans le blog
    1
    Par défaut
    Oui, c'est vrai. Tout dépend des données en entrée, comme toujours ou presque avec les regex. Ici, le problème semble être différent, on aimerait avoir plus d'infos. Pour le moment, on n'en a pas.

  12. #12
    Membre éprouvé Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 153
    Par défaut
    Du coup j'ai conservé ma solution en utilisant le split , elle fonctionne donc ça ira comme ça .

    Concernant l'encodage des fichiers , je n'en sais rien , ils sont reçus par CFT et je les traite après , hors dans certains cas les fichiers reçus sont mal formatés , et certains retour chariots sont remplacés par ces caractères , les fins de lignes étant tjrs identiques je sais les redécouper mais du coup je me retrouve avec ces caractères en dédut de la ligne suivante , que même le s/.+?2018/2018/; ne supprime pas donc ????

    Bref , j'ai mis en résolu mais ça reste une mystère ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PL/SQL] Chaine de caractères avec une quote
    Par Titouf dans le forum Oracle
    Réponses: 2
    Dernier message: 15/05/2006, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo