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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 47
    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 émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    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 :)

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 47
    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 émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    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 :)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    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
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

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

+ 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