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

Développement SQL Server Discussion :

remplacement complexe chaines de caracteres


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Par défaut remplacement complexe chaines de caracteres
    bonjour,

    je dois remplacer dans une colonne tous les '-' par des '/', SAUF le premier '-' que je trouve dans chaque record (je ne dois pas remplacer celui-la mais le laisser).

    Je n'arrive pas a trouver le script qu'il faut, le REPLACE classique ne convient pas dans mon cas a cause de ce fichu premier tiret a garder. Je ne vais quand meme pas passer par un curseur qui va faire une analyse caractere par caractere de chaque record !?

    Merci de m'aider si vous avez une solution...

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par NicaeaCivitas Voir le message
    Je ne vais quand meme pas passer par un curseur qui va faire une analyse caractere par caractere de chaque record !?
    Non, il suffit de passer par une regex. Je propose le pattern suivant, mais il faut le tester pour voir s'il est adapté ou non : (?<!^[^\-]*)[^ a-zA-Z0-9]\-?.

    Découpage du pattern :
    (?<!^[^\-]*) on vérifie qu'on ne soit pas sur le premier tiret
    [^ a-zA-Z0-9]\-? on récupère tous les tirets précédés ou suivis par un ou des caractères alphanumériques

    Test :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var source = "azefazeofmgh-ergzemroihge-qsdrg-aze5401rg-g044-";
    var replace = "/";
    var pattern = @"(?<!^[^\-]*)[^ a-zA-Z0-9]\-?";
     
    var regex = new Regex(pattern);
    var result = regex.Replace(source, replace);

    Résultat : azefazeofmgh-ergzemroihge/qsdrg/aze5401rg/g044/
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Par défaut
    Merci, cela va dans la bonne direction. Toutefois je fais du SQL server pur, directement dans MS SQL server management, je ne passe pas par un langage tierce du type C#. Donc comment utiliser regex? J'ai essayé ça ne marche pas.

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Arrffff toutes mes excuses, je n'avais pas fait gaffe qu'on était dans le forum MSSQL

    C'est Vendredi...

    Je ne sais pas si on peut faire ça en T-SQL...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Tu as 2 possibilités avec SQL Server :

    1- Passer par les OLE automation avec sp_OACreate 'VBScript.RegExp'
    2- Utiliser du SQL CLR (depuis SQL Server 2005). La deuxième méthode étant beaucoup plus sécurisée.

    ++

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    bonjour,

    ou sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT
    		STUFF(
    			REPLACE(LaColonne, '-', '/')
    			, CHARINDEX('-', LaColonne)
    			, 1
    			, '-'
    		)
    FROM LaTable

  7. #7
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Yop,

    Je n'avais pas bien lu l'énoncé (merci aieeeuuuuu). Effectivement ici pas la peine de sortir l'artillerie lourde.

    Une autre alternative (on peut s'amuser longtemps )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT 
     SUBSTRING(col1, 1, CHARINDEX('-', col1)) + 
     REPLACE(SUBSTRING(col1, CHARINDEX('-', col1) + 1, LEN(col1)), '-', '/')
    FROM table
    ++

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 60
    Par défaut
    Merci a vous 2, votre code marche ...

    Mais il y a une petite difficulté supplémentaire que l'on m'a donnée ce matin...

    si le - se trouve dans une balise (c'est a dire entre les symboles <>) (ma colonne contient du code avec des balises un peu comme XML) on ne le change pas...

    Par exemple :
    ABCD YY HK-- <TEST> ----JJKUY/P1
    KLIDSKY HK-- <TEST-2> ----JJKUY/P2

    doit donner :

    ABCD YY HK-/ <TEST> ////JJKUY/P1
    KLIDSKY HK-/ <TEST-2> ////JJKUY/P2

    est-ce possible ?

    merci encore.

Discussions similaires

  1. remplacement de chaines de caracteres
    Par catwalk dans le forum Linux
    Réponses: 1
    Dernier message: 29/08/2007, 23h25
  2. Remplacer une chaîne de caractères dans un fichier .hex
    Par subsix dans le forum Assembleur
    Réponses: 8
    Dernier message: 23/11/2006, 21h06
  3. Réponses: 10
    Dernier message: 16/06/2006, 13h53
  4. [debutant][String] Remplacer une chaine de caractère contenant un ?
    Par Jarodnet dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 12/10/2005, 12h47
  5. Réponses: 9
    Dernier message: 31/05/2005, 14h34

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