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 :

Requête/Fonction découpage selon nombre de caractères


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut Requête/Fonction découpage selon nombre de caractères
    Bonjour à tous,

    j'accède aux données d'une vue sur laquelle je n'ai pas la main mais dont je dois retravailler les données.
    L'une de ces données est une adresse, potentiellement mal formattée, que je dois rendre le plus proche possible de la norme postale.

    Je dois respecter principalement deux critères:
    - pas plus de 38 caractères par ligne
    - pas plus de 6 lignes

    J'ai ce genre de données en entrée (avec un chr(10) pour les retours chariot) :
    "M.MACRON EMMANUEL
    PALAIS DE L'ELYSEE 4E ETAGE PORTE DE DROITE

    75000 PARIS "

    Pour être conforme à la norme postale, la partie "4E ETAGE PORTE DE DROITE" devrait être sur une ligne à part.
    Mais n'ayant aucun délimiteur ou autre info, je dois simplement faire une coupure la plus propre possible.
    Je cherche donc comment procéder pour couper ma chaîne de caractères de sorte qu'une ligne ne fasse pas plus de 38 caractères et qu'aucun mot ne soit tronqué.
    Pour simplifier le tout, j'ai remarqué parfois la présence de sauts de lignes générant une ligne vide ou d'espaces intempestifs en fin de ligne.

    J'ai passé pas mal de temps à essayer de comprendre comment procéder sans arriver à quoi que ce soit de très probant.

    Auriez-vous une idée de la manière dont je pourrais obtenir le résultat suivant à partir de l'adresse ci-dessus :
    "M.MACRON EMMANUEL
    PALAIS DE L'ELYSEE 4E ETAGE PORTE DE
    DROITE
    75000 PARIS"

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Bonjour,

    Il faut créer une fonction qui prend en entré la chaîne de caractère à analyser et donne en sortie la chaîne formatée.
    L'analyse doit se passer en deux boucles :
    - La 1ere contrôle la longueur de chaque chaîne scindée par un CHR(10)
    - La seconde boucle est déclenchée si le 1er contrôle détecte une chaîne supérieure à 38 caractères
    Dans ce cas elle parcours la chaîne en parcourant chaque occurrence séparé par espace en en comptabilisant le nombre de caractère depsui le début de la chaîne
    Si on dépasse les 38 caractères alors on ajoute un CHR(10) à l'occurrence précédente et on refait le contrôle pour le reste de la chaîne

    Une fois cela fait, on pourra passer aux cas plus complexes et adapter en conséquence

  3. #3
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Scriuiw,

    merci pour ta réponse.

    Je suis OK sur l'algo à appliquer mais moins à l'aise sur son application.
    Sur le fait de splitter la chaîne en entrée, j'ai déjà un peu avancé :
    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
    with cte as
    (select distinct regexp_substr(replace(trim(q'[M.MACRON EMMANUEL
    PALAIS DE L'ELYSEE 4E ETAGE PORTE DE DROITE
     
    75000 PARIS ]'),'  ',' '),'[^('||chr(13)||chr(10)||')]+',1,level) as lines from dual
     
    connect by regexp_substr(replace(trim(q'[M.MACRON EMMANUEL
    PALAIS DE L'ELYSEE 4E ETAGE PORTE DE DROITE
     
    75000 PARIS ]'),'  ',' '),'[^('||chr(13)||chr(10)||')]+',1,level) is not null
     
    order by lines
    )
    select * from cte
    ;
    c'est pour la suite que je n'avance pas.

  4. #4
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Régler cette problématique uniquement en SQL me paraît compliqué car il va y a voir des cas qui nécessiteront des ajustements.
    Est-ce possible pour vous de créer une fonction PL/SQL qui fasse le travail ?
    Ce sera bien plus souple en mise en place et maintenance qu'une requête SQL à rallonge.

  5. #5
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Oui oui, j'ai tout à fait la possibilité de passer par une fonction ou une procédure stockée.

  6. #6
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Recherchez les fonctions possibles autour du string token pour établir le découpage de la chaîne

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/12/2012, 15h59
  2. Réponses: 2
    Dernier message: 13/04/2007, 07h09
  3. Réponses: 2
    Dernier message: 15/06/2006, 10h30
  4. requête nombre de caractères
    Par kyfmal dans le forum Access
    Réponses: 10
    Dernier message: 27/01/2006, 10h53
  5. Réponses: 10
    Dernier message: 17/12/2003, 13h51

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