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

Requêtes MySQL Discussion :

Suppression de retour chariot dans un champ - comportement étrange !


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2018
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 76
    Par défaut Suppression de retour chariot dans un champ - comportement étrange !
    Bonjour
    J'ai des tables MySQL dans lesquelles certains champs comportent (en début, au milieu ou en fin de champ) des retours chariot et/ou sauts de ligne que je voudrais supprimer
    Quand j'édite le champ dans PhpMyAdmin, je vois bien le retour à la ligne dans le texte du champ. Si je modifie une lettre dans le champ, quand je ressors de l'édition, PhpMyAdmin affiche la requête équivalente à ce que je viens de faire (c'est à dire un update) et affiche alors "\r\n" pour le caractère qui fait passer à la ligne.
    Pour supprimer ça, j'ai donc essayé plusieurs requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    update matable set champ1=replace(champ1,CHAR(13,10),' - ');
    update matable set champ1=replace(champ1,CHAR(13),' - ');
    update matable set champ1=replace(champ1,CHAR(10),' - ');
    update matable set champ1=replace(champ1,'\r\n',' - ');
    update matable set champ1=replace(champ1,'\\r\\n',' - ');
    Seule la première fonctionne mais bizarrement, ça ne marche que sur la ou les ligne(s) que j'ai déjà éditées alors que j'ai parfois des dizaines de lignes dans le même cas ; sur les lignes non éditées, la requête ne fait rien. On dirait que l'édition modifie le caractère stocké !
    Qu'est-ce qui m'échappe ?
    Merci d'avance pour vos suggestions
    Dom

  2. #2
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2018
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 76
    Par défaut
    Ma question ne semble pas inspirer grand monde !
    Est-ce que quelqu'un aurait une idée d'un autre caractère qui pourrait provoquer un retour à la ligne et du code que je pourrais essayer dans l'update-replace pour tenter de le supprimer ?
    Merci d'avance
    Dom

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Le mieux est de créer une UDF de nettoyage et de l'appliquer.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2018
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 76
    Par défaut
    Bonjour

    Merci pour ta réponse mais, pour créer une UDF (user defined function, c'est bien ça ?), il faut bien que je fournisse à cette fonction, une ou des valeur(s) à tester pour supprimer ce qui provoque ce retour à la ligne et c'est justement là que ça coince...

    J'ai testé les quelques lignes de PHP suivantes :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $chaine = mysql_result($req,0,"champ1");
    $longueur=strlen($chaine);
        for($i=0;$i<$longueur;$i++)
        {
        $caractere=substr($chaine,$i,1);
        echo "code ascii : ".$caractere."=> ALT ".ord($caractere)."<br :>";
        }
    ?>

    Ceci me renvoie bien ALT 10 et/ou ALT 13 selon les données mais on est toujours bien sur ces deux caractères
    Cependant la requête avec replace et CHAR(10) et/ou CHAR(13) ne remplace rien

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 899
    Par défaut
    Salut dom73.

    D'où proviennent vos lignes contenant ces retour chariot ?
    Est-ce un fichier que vous avez charger dans ces colonnes ?

    Le "carriage return" correspond bien au code ascii 13 (décimal) ou 0x0D (hexa).
    Et le "line feed" au code ascii 10 (décimal) ou 0x0A (hexa).

    Ce sont bien les deux requêtes suivantes qui viennent correctement modifier votre colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update matable set champ1=replace(champ1,CHAR(13),' - ');
    update matable set champ1=replace(champ1,CHAR(10),' - ');
    Citation Envoyé par dom73
    On dirait que l'édition modifie le caractère stocké !
    D'après vos dires, vous modifiez le contenu de votre colonne en l'éditant sous phpmyadmin.
    Comment procédez-vous pour éditer votre colonne ?

    @+

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    UDF...

    Il suffit de lire la chaine de caractères, caractère par caractère, et de voir si son code est inférieur à 32. Si oui, le remplacer, si non, le conserver et mettre le résultat dans la variable de retour... Simple non ?

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2018
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 76
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    UDF...
    Il suffit de lire la chaine de caractères, caractère par caractère, et de voir si son code est inférieur à 32. Si oui, le remplacer, si non, le conserver et mettre le résultat dans la variable de retour... Simple non ?
    A +
    C'est bien ce que j'ai tenté de faire avec la fonction PHP indiquée dans mon précédent post

    Voici le retour de cette fonction pour une partie de l'exemple que je donne en réponse à Artemus24 : "aquatiqueet qq peupliers"
    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
    code ascii : a=> ALT 97
    code ascii : q=> ALT 113
    code ascii : u=> ALT 117
    code ascii : a=> ALT 97
    code ascii : t=> ALT 116
    code ascii : i=> ALT 105
    code ascii : q=> ALT 113
    code ascii : u=> ALT 117
    code ascii : e=> ALT 101
    code ascii : => ALT 10
    code ascii : e=> ALT 101
    code ascii : t=> ALT 116
    code ascii : => ALT 32
    code ascii : q=> ALT 113
    code ascii : q=> ALT 113
    code ascii : => ALT 32
    code ascii : p=> ALT 112
    code ascii : e=> ALT 101
    code ascii : u=> ALT 117
    code ascii : p=> ALT 112
    code ascii : l=> ALT 108
    code ascii : i=> ALT 105
    code ascii : e=> ALT 101
    code ascii : r=> ALT 114
    code ascii : s=> ALT 115
    On voit bien ici que c'est un "ALT10" qui provoque le retour à la ligne donc l'update/replace avec CHAR(10) devrait fonctionner

  8. #8
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2018
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 76
    Par défaut
    Bonjour Artemus 24 et merci pour votre réponse

    Citation Envoyé par Artemus24 Voir le message
    D'où proviennent vos lignes contenant ces retour chariot ?
    Est-ce un fichier que vous avez charger dans ces colonnes ?
    Il s'agit de données naturalistes provenant d'une grande diversité d'origines : fichiers Excel (Windows et Mac), fichiers texte, exports venant de diverses bases naturalistes en ligne, fichiers ayant transité par Filemaker...
    Le tout se retrouve dans une table MySQL que je récupère dans cet état et je dois la nettoyer
    Les deux requêtes que vous suggérez sont les deux premières que j'ai essayées (ou regroupées en une seule avec CHAR(13,10)) mais elles n'ont aucun effet sur les retours à la ligne

    Citation Envoyé par Artemus24 Voir le message
    D'après vos dires, vous modifiez le contenu de votre colonne en l'éditant sous phpmyadmin.
    Comment procédez-vous pour éditer votre colonne ?
    Voyant que les requêtes ne donnaient rien, je suis allé voir, dans PhpMyAdmin, le contenu du champ : quand je clique sur le champ dans la ligne concernée, le contenu est accessible en édition et le saut de ligne est visible dans le contenu du texte.
    Exemple :
    Mare artificielle sans végétation aquatique
    et qq peupliers sur les rives.

    Si je modifie le contenu en ajoutant un mot quelque part, PhpMyAdmin affiche, à la validation du champ, la requête MySQL équivalente à ce que je viens de faire
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE `matable` SET `monchamp` = 'Mare artificielle sans AUCUNE végétation aquatique\r\net qq peupliers sur les rives.' WHERE `cle` = 5815;
    Ici, on voit bien le "\r\n" qui provoque le saut de ligne

    Si je fais alors tourner les requêtes qui recherchent CHAR(13) et CHAR(10), là le champ est nettoyé !!!
    Par contre, pour les autres données que je n'ai pas éditées, il ne se passe toujours rien...

Discussions similaires

  1. [AC-2010] Comment faire un "retour chariot" dans un champ de type mémo ?
    Par Velcor dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/02/2012, 13h10
  2. Nombre de retours chariot dans un champ texte
    Par henni dans le forum SQL
    Réponses: 4
    Dernier message: 25/03/2011, 12h43
  3. [WD11] Suppression de retour chariot dans fichier texte
    Par shegu dans le forum WinDev
    Réponses: 3
    Dernier message: 19/11/2009, 13h57
  4. Retour chariot dans des champs fusionnés
    Par marc56 dans le forum Excel
    Réponses: 2
    Dernier message: 05/11/2007, 16h54
  5. [VB.NET]Retour chariot dans un champ texte
    Par San Soussy dans le forum ASP.NET
    Réponses: 10
    Dernier message: 23/06/2005, 12h36

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