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 SQL Discussion :

Epurer une chaîne de caractères


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 18
    Points : 24
    Points
    24
    Par défaut [Résolu] Epurer une chaîne de caractères
    Bonjour !

    Le problème : la fonction suivante a été écrite dans le but d'épurer les chaînes de caractères rentrées.
    Par exemple : ' Hello World !' devient 'Hello World !' sans deux espaces consécutifs.
    La voici :
    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
     
    DROP FUNCTION IF EXISTS REDUCE_DELIM;//
    CREATE FUNCTION REDUCE_DELIM (str TEXT, delim CHAR(1)) RETURNS VARCHAR(255)
    BEGIN
        DECLARE f_str VARCHAR(255) DEFAULT '';
     
        DECLARE i INT DEFAULT 1;
        DECLARE car CHAR(1);
        DECLARE p_car CHAR(1);
     
        SET str = TRIM(BOTH SUBSTRING(delim, 2, 1) FROM str);
     
        WHILE i <= CHAR_LENGTH(str) DO
          SET car = SUBSTRING(str, i, 1);
          SET p_car = SUBSTRING(str, i -1, 1);
     
          IF car != delim OR p_car != delim THEN
            SET f_str = CONCAT(f_str, car);
          END IF;
     
          SET i = i + 1;
        END WHILE; 
     
        RETURN f_str;
    END;//
    Elle marche très bien avec un séparateur autre qu'un espace.
    ';;;;;;;;;;;;;;;Hello;;;;;World;;;;' devient bien 'Hello;World' si le délimiteur est le point-virgule.
    Malheureusement, elle n'aime pas les espaces. Par exemple, REDUCE_DELIM(' Hello world ', ' ') renvoie systématiquement 'Helloworld'.

    Pire, elle enlève les espaces même quand ils ne sont pas délimiteurs. REDUCE_DELIM(' __Good morning__everybody', '_ ') renvoie 'Goodmorning_everybody'.

    J'ai testé chaque fonction utilisée (TRIM, SUBSTRING, CONCAT) et aucune n'avait de comportement étrange vis-à-vis des espaces. Ceci-dit, je peux me tromper.
    Quelqu'un a une idée ?

  2. #2
    Membre actif
    Homme Profil pro
    Analyst
    Inscrit en
    Juillet 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyst
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 150
    Points : 217
    Points
    217
    Par défaut Probleme concat
    Le code suivant fonctionne sous mysql:
    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
    31
    32
    33
    DROP FUNCTION IF EXISTS REDUCE_DELIM;
    DELIMITER //
    CREATE FUNCTION REDUCE_DELIM (str TEXT, delim CHAR(1)) RETURNS VARCHAR(255)
    BEGIN
        DECLARE f_str VARCHAR(255) DEFAULT '';
     
        DECLARE i INT DEFAULT 1;
        DECLARE car CHAR(1);
        DECLARE p_car CHAR(1);
     
        SET str = TRIM(BOTH SUBSTRING(delim, 2, 1) FROM str);
     
     
        WHILE i <= CHAR_LENGTH(str) DO
          SET car = SUBSTRING(str, i, 1);
          SET p_car = SUBSTRING(str, i -1, 1);
     
          IF car != delim OR p_car != delim THEN
            SET f_str = CONCAT(f_str, car);
    	IF car = '' THEN
    	  SET f_str = CONCAT(f_str, ' ');
    	END IF;
          END IF;
     
          SET i = i + 1;
        END WHILE; 
     
        RETURN f_str;
    END;//
    DELIMITER ;
    select REDUCE_DELIM(';;HELLO;;;WORLD',';');
    select REDUCE_DELIM('  HELLO   WORLD',' ');
    Select REDUCE_DELIM(' __Good morning__everybody', '_ ') ;
    (Petite différence que je n'ai pas resolu ici: Le 1er ; reste, mais pas le 1er espace. Demarrer la boucle à partir du 2eme caractère (et réécrire le 1er avant))
    J'ai donc rajouté le IF car quand c'est un espace, CHAR est vide (je ne peux pas t'expliquer pourquoi ça ne fonctionne pas avec ton code, pourquoi aussi bien delim que var ou p_car sont vide

    Cordialement,

  3. #3
    Membre actif
    Homme Profil pro
    Analyst
    Inscrit en
    Juillet 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyst
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 150
    Points : 217
    Points
    217
    Par défaut Autre solution
    J'y suis:
    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
    DROP FUNCTION IF EXISTS REDUCE_DELIM;
    DELIMITER //
    CREATE FUNCTION REDUCE_DELIM (str TEXT, delim VARCHAR(1)) RETURNS VARCHAR(255)
    BEGIN
        DECLARE f_str VARCHAR(255) DEFAULT '';
     
        DECLARE i INT DEFAULT 1;
        DECLARE car VARCHAR(1);
        DECLARE p_car VARCHAR(1);
     
        SET str = TRIM(BOTH SUBSTRING(delim, 2, 1) FROM str);
     
     
        WHILE i <= CHAR_LENGTH(str) DO
          SET car = SUBSTRING(str, i, 1);
          SET p_car = SUBSTRING(str, i -1, 1);
     
          IF car != delim OR p_car != delim THEN
            SET f_str = CONCAT(f_str, car);
          END IF;
     
          SET i = i + 1;
        END WHILE; 
     
        RETURN f_str;
    END;//
    DELIMITER ;
    SELECT REDUCE_DELIM(';;HELLO;;;WORLD',';');
    SELECT REDUCE_DELIM('  HELLO   WORLD',' ');
    SELECT REDUCE_DELIM(' __Good morning__everybody', '_ ') ;
    Dans ta fonction(+paramètre), utilise les chaines en tant que VARCHAR(1) au lieu de CHAR(1)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 18
    Points : 24
    Points
    24
    Par défaut
    Effectivement, utiliser des VARCHAR a résolu le problème !

    Tout ça parce que les CHAR rajoutent des espaces pour arriver à la taille précisée.

    Merci beaucoup !

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Saisie et affichage d'une chaîne de caractères
    Par sali dans le forum Assembleur
    Réponses: 2
    Dernier message: 31/03/2004, 18h01
  3. [Debutant(e)] Analyse d'une chaîne de caractères
    Par maire106 dans le forum Langage
    Réponses: 6
    Dernier message: 22/03/2004, 15h04
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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