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

Scripts/Batch Discussion :

Fonction pour remplacer plusieurs valeurs présentent dans un string par des valeurs précises [PowerShell]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut Fonction pour remplacer plusieurs valeurs présentent dans un string par des valeurs précises
    Bonjour bonjour,

    Il vous ai peut-être arrivé, comme moi actuellement, d'avoir un string avec plein de caractères que vous ne voulez pas voir.

    Vous pouvez enchaîner les .replace mais... avouons le, c'est pas très beau. C'est pas très beau et en plus on s'y perd facilement.

    Dans ce cas, soyez sans craintes, super JeanYvette vous partage la fonction qu'il a fait :

    Code PowerShell : 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
    function ReplaceMultipleChar {
        param(
            [string]$ChaineAChanger,
            [string]$DonneesKO,
            [string]$DonneesDeRemplassement) 
     
        if ($ChaineAChanger.length -lt 1) {
            return
        }
        if ($DonneesDeRemplassement.length -lt 1) {
            return
        }
        if ($DonneesKO.length -lt 1) {
            return $ChaineAChanger
        }
     
        $TailleChaine = $ChaineAChanger.Length
        for($NbBoucle = 0;$NbBoucle -lt $TailleChaine; $NbBoucle++)
        {
            $ValeurEnCours = $ChaineAChanger.substring($NbBoucle, 1)
            $Position = $DonneesKO.IndexOf($ValeurEnCours)
            if( $Position -gt -1)
            {
                $NouvelleLettre = $DonneesDeRemplassement.substring($Position, 1)
                $NewString = $ChaineAChanger.replace($ValeurEnCours,$NouvelleLettre)
                $ChaineAChanger = $ChaineAChanger.replace($ValeurEnCours,$NouvelleLettre)
            }
        }
     
        return $NewString
    }
    $New = ReplaceMultipleChar "aàaeééériééççéàéé&eefzf" "éçà" "eca"
     
    Write-Host "Valeur corrigé : " $New

    Je me suis inspiré de l'algo de SQLPRO (Rendons lui honneur) sur une fonction qu'il a faite sur sql server.

    Ici, dans les paramètres vous avez :
    1 = Le string où vous avez des caractères que vous ne voulez plus
    2 = La liste des caractères que vous ne voulez plus
    3 = La liste des caractères que vous voulez voir à la place

    A noter qu'il faut que les caractères que vous ne voulez plus soient dans le même ordre que la liste des caractères de remplacement.

    Il existe un moyen plus simple de le faire, dans ce cas, béni soit la personne qui me le montrera.

    Mais en attendant, au cas où cela peut servir, je vous le partage bien volontiers

    Bisous bisous

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Je vois beaucoup d'inconvénient ou limitation à ta fonction :

    Ne remplace que des caractères et pas de chaine.
    Ne permet pas de supprimer un caractère (remplacement d'un caractère par du vide).
    Pas de gestion de casse
    Le problème que tu a énoncer "il faut que les caractères que vous ne voulez plus soient dans le même ordre". Quand tu en as beaucoup il peut devenir difficile (visuellement) de retrouver le caractère de remplacement.
    $DonneesKO et $DonneesDeRemplassement doivent être de même longueur (pas de vérification)

    On peux aussi se faire un petit "kif" en acceptant les pipelines en entré.

    Code powershell : 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
    43
    44
    45
    function creplaces {
        param(
            [Parameter(ValueFromPipeline)]
            [string]$ChaineAChanger,
            [System.Collections.Hashtable]$TableauDeRemplacement
            )
     
            $TableauDeRemplacement.GetEnumerator() | ForEach-Object {$ChaineAChanger = $ChaineAChanger -creplace [Regex]::Escape($_.Key), $_.Value}
            return $ChaineAChanger
    }
     
    function ireplaces {
        param(
            [Parameter(ValueFromPipeline)]
            [string]$ChaineAChanger,
            [System.Collections.Hashtable]$TableauDeRemplacement
            )
     
            $TableauDeRemplacement.GetEnumerator() | ForEach-Object {$ChaineAChanger = $ChaineAChanger -ireplace [Regex]::Escape($_.Key), $_.Value}
            return $ChaineAChanger
    }
    Set-Alias -Name replaces -Value ireplaces
     
     
    $chaine = "ABC ** FFF aàaeééériééççéàéé&eefzf"
     
    $chaine
     
    creplaces $chaine @{
        'é' = 'e'
        'ç' = 'c'
        'à' = 'a'
        'F' = ''
        'abc' = 'CBA'
        '**' = '99999'
    }
     
    $chaine | creplaces -TableauDeRemplacement @{
        'é' = 'e'
        'ç' = 'c'
        'à' = 'a'
        'F' = '#'
        'abc' = 'CBA'
        '**' = 'OO'
    }

    Nous pourrions certainement optimiser la vitesse de traitement au détriment de la lisibilité, mais c'est l'idée qui compte

  3. #3
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Salut salut

    Merci pour tes commentaires. Pour les premiers points de tes inconvénients, il est vrai. Je n'y ai pas spécialement pensé dans le sens où je n'avais pas ces besoins dans mon cas. J'ai donc fait "le minimum" en un sens. Pour la taille des deux strings par contre oui, c'est un peu nul de pas y avoir pensé

    Quoi qu'il arrive merci de ta version du code

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/07/2014, 11h47
  2. Réponses: 11
    Dernier message: 31/01/2013, 10h56
  3. [XL-2010] Dans une fonction, comment tester plusieurs valeurs d'une seule cellule
    Par yzf-r dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 23/08/2011, 11h09
  4. Code pour insérer plusieurs valeurs dans une cellule
    Par azerty1956 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/03/2009, 13h09
  5. Fonction REPLACE pour remplacer plusieurs caract?
    Par Davjack dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/06/2008, 17h39

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