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

PL/SQL Oracle Discussion :

Une regex pour formater une chaine de caractères [11gR1]


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2012
    Messages : 77
    Points : 85
    Points
    85
    Par défaut Une regex pour formater une chaine de caractères
    Bonjour,

    Je suis en train de coder une procédure et en fait, j'aurai besoin de transformer une chaine de caractères. Pour le coup, un simple substr ou trim ne suffira pas, il faut que je passe par une regex. Chose que je ne connais pas du tout!

    Voici un exemple de mes données de base :
    ID | VALEUR
    01 012345 FRAISE
    02 012345 ABRICOT
    03 012345 POMME,012345 MANGUE,012345 TOMATE
    Ma valeur de base fait toujours 15 caractères, avec des espaces pour assurer cette longueur fixe.
    Voyez qu'au niveau de ma valeur, je peux avoir une concaténation. D'où la nécessité d'une regex, il me semble.

    J'aurai plusieurs traitement à envisager. Trois en fait.
    - Le premier traitement serait de récupérer :
    ID | VALEUR
    01 FRAISE
    02 ABRICOT
    03 POMME,MANGUE,TOMATE
    - Le second serait de récupérer :
    ID | VALEUR
    01 012345 FRAISE
    02 012345 ABRICOT
    03 012345 POMME
    03 012345 MANGUE
    03 012345 TOMATE
    C'est à dire une ligne par valeur (bien-sûr l'ID ici est un ID de rattachement, pas l'ID de la ligne)

    - Le dernier serait de récupérer :
    ID | VALEUR
    01 FRAISE
    02 ABRICOT
    03 POMME
    03 MANGUE
    03 TOMATE
    Je m'excuse si j'ai l'air de passer commande mais pour le coup, je connais très mal les regex et je n'ai pas la possibilité de me former dessus en ce moment. Mais il faudra bien un jour tellement c'est pratique.

    En fait, j'avais envisagé ça au départ (si si, j'ai travaillé un peu!) pour récupérer FRAISE ou ABRICOT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maChaine:=trim(substr(valeur,7));
    Mais ça ne s'applique qu'au cas où je n'ai qu'une seule valeur,pas de concaténation.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Pour le 1er un simple TRANSLATE devrait suffir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQL> select substr(translate('012345 POMME,012345 MANGUE,012345 TOMATE','0123456789 ,',','),2) from dual;
     
    SUBSTR(TRANSLATE('0
    -------------------
    POMME,MANGUE,TOMATE
     
    SQL>
    Si c'est plus compliqué, regardez aussi : Supprimer des champs précis d'une chaîne de caractères

    Pour le 2eme regardez Transformer les éléments d'une liste en enregistrement

    Pour le 3eme ce sera une combinaison des 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    SQL> column valeur format a30
    SQL>   with data as (
      2  select '01' as id, '012345 FRAISE' as valeur from dual union all
      3  select '02'      , '012345 ABRICOT' from dual union all
      4  select '03'      , '012345 POMME,012345 MANGUE,012345 TOMATE' from dual
      5  )
      6  SELECT t.id, trim(translate(x.column_value,'0123456789',' ')) AS valeur
      7    FROM data t
      8   CROSS JOIN TABLE(
      9                    cast(multiset(
     10                             SELECT substr( ','||valeur||',',
     11                                            instr( ','||valeur||',', ',', 1, rownum )+1,
     12                                            instr( ','||valeur||',', ',', 1, rownum+1 )
     13                                                   -instr( ','||valeur||',', ',', 1, rownum )-1
     14                                           )
     15                              FROM dual
     16                           connect BY level <= length(valeur)-length(REPLACE(valeur,',',''))+1
     17                                 ) AS sys.odcivarchar2list )
     18                         ) x
     19  /
     
    ID VALEUR
    -- ------------------------------
    01 FRAISE
    02 ABRICOT
    03 POMME
    03 MANGUE
    03 TOMATE
     
    SQL>

  3. #3
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2012
    Messages : 77
    Points : 85
    Points
    85
    Par défaut
    En fait oui c'est un peu plus compliqué, je voulais récupérer la logique puis m'en débrouiller pour faire ma sauce.
    Les valeurs sont plutôt du genre '012345 FR1234', donc je ne peux pas simplement supprimer tous les chiffres. Qu'est ce que ça aurait été beau!
    La fonction Translate m'était inconnue, je la garde dans un coin de la tête car elle est vraiment intéressante! Merci!

    Je suis donc aller voir le premier lien et la réponse donnée peu effectivement s'appliquer à ma question, en ajustant la regex.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH t AS (
    SELECT 'les donnees sont : Valeur1 = 123456 , Valeur2 = 12345 , Valeur3 = TOTO , Valeur4 = TITI123, Valeur5 = 12345678' AS chaine
    FROM dual
    )
    SELECT regexp_replace(chaine, '(=)( )?([[:alnum:]])+( )?(,)?', '\1 \5')
    FROM t;
     
    REGEXP_REPLACE(CHAINE,'(=)()?([[:ALNUM:]])+()?(,)?','\1\5')
    -----------------------------------------------------------------------------
    les donnees sont : Valeur1 = , Valeur2 = , Valeur3 = , Valeur4 = , Valeur5 =
    Sauf que je suis une nooooooooob et que je ne sais pas faire!
    Je ne sais même pas comment lire ce truc!

    EDIT : en fait en y pensant, dans mon cas il faut que je supprime tous les caractères, espaces compris, entre la virgule et la première lettre croisée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     regexp_replace(chaine, '(,)()?([[:ALNUM:]]|[[:SPACE:]])?+()?([:alpha:])?', '\1 \5')
    ??
    ... Sauf que la première valeur n'est pas précédée par une virgule...
    Oh, et je ne comprends pas à quoi sert cette partie de la regex '\1 \5', si vous pouviez m'expliquer rapidement.

    Merci beaucoup.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par akkyshan Voir le message
    en fait en y pensant, dans mon cas il faut que je supprime tous les caractères, espaces compris, entre la virgule et la première lettre croisée.
    Pouvez-vous donner un exemple précis, je ne vois pas ce que la "première lettre croisée" veut dire.

  5. #5
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2012
    Messages : 77
    Points : 85
    Points
    85
    Par défaut
    Pour être plus concrète, une valeur ressemble à ça
    012345 AB01234, 012345 BF4568, 012345 UH78325
    Donc je me disais que finalement, il faut que je supprime les caractères entre la virgule et la première lettre rencontrée (A,B,U), mais ça ne fonctionne pas pour le premier élément qui n'est pas précédé par une virgule.

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par akkyshan Voir le message
    mais ça ne fonctionne pas pour le premier élément qui n'est pas précédé par une virgule.
    Ben il suffit de concaténer une virgule au début

    Est ce que ça convient au besoin ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL>   WITH t AS (
      2  SELECT '012345 AB01234, 012345 BF4568, 012345 UH78325 ' AS chaine
      3    FROM dual
      4  )
      5  select substr(regexp_replace(',' || chaine, ',[ ]*[[:digit:]]*[ ]*',','),2) result
      6    from t;
     
    RESULT
    -----------------------
    AB01234,BF4568,UH78325
     
    SQL>

  7. #7
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2012
    Messages : 77
    Points : 85
    Points
    85
    Par défaut
    Ça convient parfaitement oui!
    Par contre, il faut vraiment que je me mette dans les tutos parce que je ne comprends pas du tout ce langage du démon!

    Bref! Merci beaucoup! Ce n'est pas la première fois que vous m'aidez sur le forum, et vraiment c'est très sympa!

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

Discussions similaires

  1. Lien dans un frame d'une cadre pour ouvrir une autre page sur une même fenêtre
    Par maelislah dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 27/06/2015, 20h39
  2. regex pour supprimer une ligne commençant par une lettre
    Par stpaul04 dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 03/02/2011, 22h04
  3. [RegEx] Besoin d'une expression pour formater une chaîne
    Par Space Cowboy dans le forum Langage
    Réponses: 9
    Dernier message: 17/08/2007, 10h29
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24
  5. [langage] cherche script pour formater une chaine
    Par MASSAKA dans le forum Langage
    Réponses: 7
    Dernier message: 12/11/2003, 12h18

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