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 :

Nettoyage et comparaison de chaines


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Nettoyage et comparaison de chaines
    Bonjour

    Je suis confronté au probleme suivant en csharp

    1- Je dispose d'une liste de string
    2- Comme toute bonne liste de string, on a ecrit comme on peut

    j'écris comme je veux
    J'ecris comme je VEUX
    JECRIS come je veux
    j ecris-comme-je.veux !!!!!

    Pour moi, tous ces string on la meme valeur
    Je vais donc ecrire une petite fonction StringToKey

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public StringToKey("j   écris-Comme-je.veux !!!!!")
    {
     
       return "JECRISCOMEJEVEUX";
    }
    En C, je maitrise bien la maniere la plus efficace de faire
    Mais pour ne pas traduire betement du C en Csharp quelle serait la maniere la plus efficace en Csharp

    Suggestion

    Step 1- ToUpper
    Step 2- ToCharArray
    Step 3- Parcourir CharArray pour recuperer les Ascii et eliminer les double

    Est la meilleure methode ?

    Merci pour vos suggestions

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Une manière de procéder, maintenant je ne pense pas que ce soit la plus efficace (ma façon de faire pour supprimer les accents peut être vue comme consommatrice en temps suivant les impératifs je suppose) mais ça peut largement suffire ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    string s = "j   écris-Comme-je.veux !!!!!";
    // On supprime les caractères non alphanumérique
    s = Regex.Replace(s, @"\W", string.Empty);
    // On supprime les accents
    s = RemoveDiacritics(s);
    // On normalise le format de la chaîne en forçant la mise en majuscule
    s = s.ToUpper();
    RemoveDiacritics étant une méthode permettant de supprimer les accents présents dans une chaîne de caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public String RemoveDiacritics(String s)
    {
        String normalizedString = s.Normalize(NormalizationForm.FormD);
        StringBuilder stringBuilder = new StringBuilder();
     
        for (int i = 0; i < normalizedString.Length; i++)
        {
            Char c = normalizedString[i];
            if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
                stringBuilder.Append(c);
        }
     
        return stringBuilder.ToString();
    }
    Une version simplifiée, si cela suffit pour les besoins (pour la langue française ce doit être le cas normalement), et plus rapide pourrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static String RemoveDiacritics(String s)
    {
        byte[] tab = System.Text.Encoding.GetEncoding(1251).GetBytes(s);
        return System.Text.Encoding.ASCII.GetString(tab);
    }
    Niveau performance je ne pense pas que l'expression régulière pose problème. Au pire il y a toujours moyen de la remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    StringBuilder b = new StringBuilder();
    foreach (char c in s)
    {
        if (char.IsLetterOrDigit(c))
        {
            b.Append(c);
        }
    }
    mais j'ai un doute sur la différence en terme de performance.

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Stormimon

    Effectivement ta methode a l'avantage de la lisibilité mais au détriment de la performance sans doute

    Mon idées du ToChararray est sans doute inutile car on peut directement utiliser l'indice dans la string pour recuperer le char

    J'aime bien le principe d'un seul parcours qui teste la validité et gere la transformation du caractere
    C'est ce que tu fais dans RemoveDiacritics

    Je dois voir a quoi sert

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s.Normalize(NormalizationForm.FormD);
    Dans un autre post tu avais évoqué l'usage d'un tableau (c'est ce que je fais en C : je prepare un tableau de traduction sur 256 caractere qu'on peut indicer directement, ca permet entre autre si nécesaire de transformer un 0 en 'O' et de placer des codes spéciaux pour les caracteres vides ou séparateurs, mais avec de l'unicode, c'est moins évident

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string str = "àâäéèêëîïôöùûü";
    byte[] tab = System.Text.Encoding.GetEncoding(1251).GetBytes(str);
    string result = System.Text.Encoding.ASCII.GetString(tab);

    Je vais sans doute faire simple dans un premier temps en utilisant la methode
    Que tu propose, on, ameliorera si nécessaire !

  4. #4
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Si les performances jouent le seul moyen de savoir c'est de tester les différentes façon de procéder en conditions réelles et voir ce que ça donne. Mais la version simplifiée pour supprimer les accents est évidemment plus rapide.

    Sur mon PC, ça me prend 5-7ms pour traiter la chaîne complètement (suppression des caractères inutiles, des accents et mise en majuscule) et 1-2ms avec la version simplifiée de la suppression d'accents. Mais cette différence n'est pas forcément importante en condition réelle et en fonction de tes besoins.

    En tout cas, une fois résolu n'oublie pas le "clic bouton"

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    La différence est de taille !

    Imagine que je doive traiter les 40.000 noms de communes Française
    Cela ferait +/- 1 minutes avec le methode "rapide"
    7 minutes avec la methode "moderne"

    Je peux t'assurer qu'en C je fais cela en moins de 5 secondes, lecture du fichier comprise

    Methode :

    J'alloue un tableau Tbl de 256 caractere
    Je set l'ensemble '\0'

    Je prepare les traducteur

    Tbl['a']='A';
    Tbl['é']='E';


    Je prepare les spliteurs

    Tbl[',']=9;
    Tbl['|']=9;

    Etc

    Ensuite je construit ma chaine en passant par la table de traduction
    Ca arrache !!

    Bien entendu, ma table est construite avant le traitement en boucle

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

Discussions similaires

  1. [VBA]excel comparaison de chaine de caractere
    Par ogenki dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/01/2006, 15h32
  2. [langage] Comparaison de chaîne
    Par Fastshadow dans le forum Langage
    Réponses: 7
    Dernier message: 05/09/2004, 18h58
  3. comparaison de chaines de caracteres en PLSQL
    Par biozaxx dans le forum PL/SQL
    Réponses: 3
    Dernier message: 19/08/2004, 09h41
  4. Comparaison de chaines
    Par Marc_P dans le forum Linux
    Réponses: 6
    Dernier message: 17/02/2004, 17h04
  5. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41

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