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

C# Discussion :

remplacement de chaine recursif


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 3
    Par défaut remplacement de chaine recursif
    Bonjour à tous,

    j'ai le problème suivant :

    j'ai besoin de monter une méthode me permettant à partir de la chaine suivante :
    "Replace(Replace(\fichier.csv,.csv,.xls),fi,aaa))"

    d'obtenir le résultat "\aaachier.xls"

    Cad que je veux appeler la méthode replace récursivement sur ma chaine autant de fois que je trouve l'expression Replace(chaine,oldValue,newValue)

    j'ai toujours été un boubourse en récursivité et ça se confirme car je n'y arrive pas

    qqu'un aurait déjà fait cela ?
    toute aide serait la bien venue

    thanks

    ++
    zav

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Replace récursif (j'ai pas vs ici, donc de mémoire)

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (chaine.IndexOf(tofind) != -1)
    {
        chaine = chaine.Replace(tofind,toreplace);
    }

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 87
    Par défaut
    Bonjour Zavatha,

    Voici un bout de code qui fait ce que tu demandes.
    C'est moche mais c'est une première approche.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
            private string GetSourceString(string sChaine)
            {
                // format de sChaine : "Replace(chainetest,oldvalue,newvalue)"
     
                //décomposition de sChaine en 3 paramètres
                string[] sReplaceParameters = GetReplaceParameters(sChaine);
                if (sChaine.Substring(8).Contains("Replace"))
                {
                    //si chainetest contient Replace appel récursif de la procédure sur chainetest
                    return GetSourceString(sReplaceParameters[0]).Replace(sReplaceParameters[1], sReplaceParameters[2]);
     
                }
                //si chainetest ne contient pas de replace on retourne simplement le résultat de la fonction replace 
                return sReplaceParameters[0].Replace(sReplaceParameters[1], sReplaceParameters[2]);
            }
     
     
            //procédure pour obtenir les 3 paramètres de ton Replace(chainetest,oldvalue,newvalue)
            //Je te l'accorde c'est moche mais c'est vite fait et ça marche. 
            //je penses qu'on pourrait même récupérer récursivement les paramètres.
            private string[] GetReplaceParameters(string sChaine)
            {
                string[] sReplaceParameters = new string[3];
                int i = sChaine.Length;
                while (!sChaine[i-1].Equals(','))
                {
                    i--;
                }
                sReplaceParameters[2] = sChaine.Substring(i, sChaine.Length - 1 - i);
                i--;
                int j = i;
                while (!sChaine[j - 1].Equals(','))
                {
     
                    j--;
                }
                sReplaceParameters[1] = sChaine.Substring(j, i-j);
                sReplaceParameters[0] = sChaine.Substring(8, j-9);
     
     
                return sReplaceParameters;
            }
    Replace(Replace(\fichier.csv,.csv,.xls),fi,aaa)devient \aaachier.xls

    Replace(Replace(Replace(\fichier.csv,.csv,.xls),fi,aaa),aaa,test) devient \testchier.xls

    Cordialement,
    MvK

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 3
    Par défaut
    bonjour,

    merci de vos réponses.
    Ta solution mvk0610 répond bien au problème

    le souci c'est que le cahier des charges vient (encore) de changer...

    je m'y colle donc une fois de plus.

    merci à tous
    ++

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    J'attire juste ton attention sur le fait que "Replace", même s'il n'est pas récursif, remplace toutes les occurrences de la chaîne recherchée par une autre.

    Ainsi, avec la chaîne "totototo" :

    Replace("totototo", "toto", "tito")

    Donnera : "titotito"

    Hors, avec un remplacement "purement récursif", à chaque récursion, on ne remplacement qu'une seule occurrence :

    Premier passage :
    "totototo" => "titototo"
    Second passage :
    "titototo" => "tititoto"
    Troisième passage :
    "tititoto" => "tititito"

    On n'arrive donc pas au même résultat.

    Vérifier donc dans la fonction récursive que vous ne remplacez que la première occurrence du mot, ou alors que vous remplacez toutes les occurrences en votre âme et conscience.

Discussions similaires

  1. [Système] Remplacer une chaine par un lien hypertexte
    Par Bisûnûrs dans le forum Langage
    Réponses: 10
    Dernier message: 06/06/2007, 09h34
  2. Réponses: 7
    Dernier message: 27/09/2005, 11h54
  3. Word ole et demande de remplacement de chaine
    Par dd16 dans le forum Langage
    Réponses: 6
    Dernier message: 24/09/2005, 12h56
  4. Réponses: 9
    Dernier message: 31/05/2005, 14h34
  5. Réponses: 4
    Dernier message: 16/04/2004, 16h31

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