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 performant des caractères spéciaux d'une chaine par d'autres [FAQ]


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 47
    Points : 38
    Points
    38
    Par défaut remplacement performant des caractères spéciaux d'une chaine par d'autres
    bonjour,

    j'ai un problème avec le remplacement de caractères particuliers par d'autres caractères dans une chaine. En effet, j'utilise un bout de code intéressant mais relativement long à l'exécution, en fonction de la taille de la chaine à "nettoyer".

    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
     
    public string remplaceCaracteres(String chaine){
                // déclaration des tableaux, source et destination
                string accent       = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÌÍÎÏìíîïÙÚÛÜùúûüÿÑñÇç°";
                string sansAccent   = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeIIIIiiiiUUUUuuuuyNnCc-";
     
                // Conversion des chaines en tableaux de caractères
                char[] tableauAccent = accent.ToCharArray(); 
                char[] tableauSansAccent = sansAccent.ToCharArray();
     
                // pour tous les caractères à tester
                for(int i=0; i < accent.Length; i++){
                    // Remplacement de l'accent par son équivalent sans accent dans la chaîne de caractères
                    chaine = chaine.Replace(tableauAccent[i].ToString(), tableauSansAccent[i].ToString());
                }
     
                return chaine;
            }
    Ca marche bien, mais c'est lent...

    Connaissez-vous une manière plus rapide pour traiter ce genre de problème? Par exemple en utilisant une méthode dont j'ignore jusqu'à l'existance

    Merci beaucoup pour les réponses qui vont suivre...

    ....Loïc

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Ah chouette un petit jeu :)
    Une idée vite fait :
    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
    public class StringCleaner
    {
    	#region Constants
    	private const string SpecialCharacters = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÌÍÎÏìíîïÙÚÛÜùúûüÿÑñÇç°";
    	private const string CleanCharacters = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeIIIIiiiiUUUUuuuuyNnCc-";
    	#endregion
     
    	#region Fields
    	private readonly Dictionary<char, char> _mappings = new Dictionary<char, char>();
    	#endregion
     
    	#region Public Constructors
    	public StringCleaner()
    	{
    		for ( int i = 0 ; i < SpecialCharacters.Length ; ++i )
    		{
    			_mappings.Add( SpecialCharacters[ i ], CleanCharacters[ i ] );
    		}
    	}
    	#endregion
     
    	#region Public Methods
    	public string Clean( string input )
    	{
    		char[] characters = input.ToCharArray();
     
    		for ( int i = 0 ; i < characters.Length ; ++i )
    		{
    			char c;
    			if ( _mappings.TryGetValue( characters[ i ], out c ) )
    			{
    				characters[ i ] = c;
    			}
    		}
     
    		return new string( characters );
    	}
    	#endregion
    }
    C'est déjà nettement plus rapide que les replace à la chaîne (et le dico est plus rapide qu'un scan de tableau)

    Bon y a probablement mieux, mais c'est juste le truc qui m'a traversé la tête sur le moment et c'était marrant à faire :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 47
    Points : 38
    Points
    38
    Par défaut
    coucou et merci de ta réponse!

    C'est vrai que c'est plus rapide mais je trouve ça encore vraiment très lent pour ce type de problème. J'ai la chance de développer sur un PC assez récent et le ventilo tourne au moment de l'exécution de la procédure c'est assez marrant mais bon...

    En tout cas c'est mieux que mon code alors mici beaucoup Maniak

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par loic72
    C'est vrai que c'est plus rapide mais je trouve ça encore vraiment très lent pour ce type de problème.
    Ah bah c'est pas lumineusement rapide non. Après faut voir dans quel contexte c'est utilisé :)

    Citation Envoyé par loic72
    J'ai la chance de développer sur un PC assez récent et le ventilo tourne au moment de l'exécution de la procédure c'est assez marrant mais bon...
    Normal, le processeur tourne à fond pendant le traitement :)

    Enfin sur le mien, pour traiter un million de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    StringCleaner.SpecialCharacters + StringCleaner.SpecialCharacters +
    StringCleaner.SpecialCharacters + StringCleaner.SpecialCharacters;
    soit 216 caractères, tous à remplacer, ça met moins de 10 secondes. Ça reste correct :)
    En tout cas compilé en platforme x86, ça fait moins de 10 secondes. Compilé en 'Any CPU', ça fait plus du double. Pas sûr de piger pourquoi, mais il y a sûrement une raison parfaitement logique (on va dire ça :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  5. #5
    Membre actif Avatar de Gulix
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 273
    Points
    273
    Par défaut
    Voici un petit code qui pourrait vous aider. Je l'ai testé, et il fonctionne pas trop mal. Bon, trouvé sur le net, hein, c'est pas de moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public static string RemoveSpecialChars(string input)
    {
    	byte[] aOctets = System.Text.Encoding.GetEncoding(1251).GetBytes(input);
    	return System.Text.Encoding.ASCII.GetString(aOctets);
    }
    "L'univers... on croit qu'il est infini mais quand on arrive au bout un gorille géant vous balance des tonneaux."
    Phillip J. Fry

    http://www.gulix.fr/

    BlindShark, Logiciel de Blind Test - Pull N' Bounce - Jeu XNA

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 47
    Points : 38
    Points
    38
    Par défaut
    Effectivement c'est tres rapide merci beaucoup pour ces solutions.
    ++

  7. #7
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Excellente cette astuce !
    Ptet ça mériterait une FAQ : Comment remplacer les caractères spéciaux d'une chaîne ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par loic72
    Effectivement c'est tres rapide merci beaucoup pour ces solutions. :P
    ++
    Cela dit c'est plus lent chez moi que la version dico, ça ne fait pas le remplacement de ° en - et tu peux perdre pas mal d'autres caractères spéciaux au passage. Faut faire gaffe quoi :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  9. #9
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 47
    Points : 38
    Points
    38
    Par défaut
    yop

    pour le remplacement des caractères particuliers (genre ° en -) je les traite en amont au cas par cas, avant d'utiliser la solution plus haut pour les caractères "génériques".

    Voilou

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Gare aux caractères 'non-génériques' qui sont aussi remplacés en jouant sur l'encodage.

    (c'est plus simple hein, je dis pas. mais les différences entre pages de code, c'est pas juste une question d'accent. faut vérifier le reste aussi :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

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

Discussions similaires

  1. Remplacer des caractères spéciaux dans une chaine
    Par enzostar dans le forum Langage
    Réponses: 5
    Dernier message: 29/09/2012, 23h16
  2. Réponses: 13
    Dernier message: 06/12/2011, 14h17
  3. Remplacer caractères spéciaux dans une chaine
    Par Peyothe dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/08/2009, 13h32
  4. [RegEx] caractère spéciaux dans une chaine
    Par BigBarbare dans le forum Langage
    Réponses: 3
    Dernier message: 12/04/2006, 11h53
  5. [Jsp] Supprimer les caractère spéciaux d'une chaine
    Par PeteMitchell dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 13/05/2004, 11h11

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