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 :

Supprimer un doublon dans un string [Débutant]


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 29
    Points : 25
    Points
    25
    Par défaut Supprimer un doublon dans un string
    Bonjour,

    Je recherche comment je pourrais supprimer un doublon contenu dans une chaine de caractères, par exemple j'ai:

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    string str = "je rechercheje recherche";

    et je souhaiterais que str contienne uniquement "je recherche".

    Mais sachant que dans mon cas les mots sont collés je ne vois pas trop comment m'y prendre. Sûrement avec des expressions régulières mais je ne sais pas trop comment m'y prendre malheureusement.

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Ce n'est pas un problème facile car pour des raisons de complexité (au sens algorithmique), la viabilité d'une solution regex simple va dépendre:
    • de la taille de la chaîne de départ.
    • si la répétition occupe toute la chaîne (comme dans ton exemple) ou s'il ne peut s'agir que d'une partie de la chaîne
    • du nombre de mots/lettres minimum et maximum de la partie répétée.
    • si la répétition est toujours agglutinée à la première partie ou si elle peut en être séparée par exemple avec un espace.


    Mise à part ces questions essentielles: As-tu déjà essayé quelque chose? (si oui poste le) Et as-tu attaqué un tutoriel sur les regex? (histoire de savoir de quoi on parle).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    Non je n'ai encore rien essayé, car comme je le dit je ne sais pas par où attaquer ce problème.

    Après oui j'ai commencé un peut à potasser les expressions régulières, dans l'espoir de trouver une solution, mais si je peut être aiguillé ça m'aiderais grandement.

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Ok, et qu'en est il des points précédents?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    d'où provient le doublon ?
    ca peut aider à trouver une solution

    s'il n'y a pas de règle en amont, ca sera dure de faire une règle en aval ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    En fait il s'agit de plusieurs entrées dans un fichier texte, et sur certaines lignes j'ai un doublon qui fait que la ligne se répète, mais qu'une seule fois, et sans espace (exactement comme dans mon premier post).

    Pour les points suivants:

    de la taille de la chaîne de départ.
    La taille est variable.

    si la répétition occupe toute la chaîne (comme dans ton exemple) ou s'il ne peut s'agir que d'une partie de la chaîne
    La répétition occupe toute la chaîne comme dans mon exemple.

    du nombre de mots/lettres minimum et maximum de la partie répétée.
    Une seule répétition par ligne.

    si la répétition est toujours agglutinée à la première partie ou si elle peut en être séparée par exemple avec un espace.
    La répétition est toujours agglutinée à la première partie.

  7. #7
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    comme pol63, plutôt que de résoudre la maladie, il serait plus judicieux de la prévenir et donc, de comprendre et de résoudre d'ou vient cette irrégularité..
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je ne disais pas vraiment de traiter ca en amont (on ne peut pas toujours) mais surtout d'avoir des détails sur comment le truc fait des doublons

    et donc si c'est un truc qui est répété et collé c'est simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for each ligne in lignes
      if ligne.substring(ligne.length/2)  & ligne.substring(ligne.length/2) = ligne then 
           ligne = ligne.substring(ligne.length/2)
    ...
    c'est du code vb.net mais l'idée est là
    on découpe en 2 si les 2 parties sont égales c'est un doublon
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Bon basiquement, pour trouver quelque chose qui se répète avec une regex, on peut utiliser (.+)\1 où les parenthèses définissent un groupe de capture et où \1 est une référence à ce groupe de capture. Mais c'est avec cette pattern qui n'a l'air de rien que les problèmes commencent car à cette pattern correspond une sous-chaîne qui n'a ni taille précise, ni point de départ précis ce qui fait que pour une chaîne de n caractères, le moteur de regex devra tester n*(n-1)/2 possibilités d'où le problème de complexité.

    Donc en pratique, ce genre de pattern est inutilisable (sauf pour de petites chaînes) à moins de parvenir à réduire de manière drastique le nombre de possibilités à tester à l'aide de contraintes que sont la taille maximum (et minimum mais dans une moindre mesure) de la répétition et sa position possible.

    D'après les informations que tu donnes, la sous-chaîne originale suivie de sa répétition occupent une seule ligne complète et ne se produit que pour certaines lignes. Ça réduit considérablement le champ d'exploration puisque la pattern n'a besoin d'être testée qu'aux débuts de ligne. On peut alors l'écrire avec les ancres de début et de fin de ligne ^(.+)\1$ en utilisant l'option RegexOptions.Multiline (voir la documentation microsoft). Il est aussi prudent de fixer une longueur minimale (disons 5) pour éviter qu'une ligne contenant "toto" ou "201201" soit remplacée. Ce qui donne:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Regex rgx = new Regex(@"^(.{5,})\1$", RegexOptions.Multiline);
    text = rgx.Replace(text, "$1");

    Maintenant cette approche a certains désavantages:
    • toutes les sous-chaînes dont la taille est supérieur à la moitié de la ligne vont être testées (pour rien). On peut éventuellement changer le quantificateur en non-greedy pour s'épargner les lignes où il y a effectivement une répétition, mais je ne pense pas que la différence de performance soit saisissante.
    • la pattern telle qu'écrite avec son option multiline est conçue pour être appliquée à l'ensemble d'un fichier donc avec l'intégralité du fichier chargé en mémoire, ce qui peut être problématique si la taille est conséquente. (cela dit rien n'empêche de faire la même chose avec une lecture ligne par ligne)


    Donc je te conseille de tester une autre méthode qui prend en compte ces deux points:

    Au lieu de charger l'intégralité du fichier dans un string, tu vas lire le fichier comme un flux ligne par ligne, tu ouvres un nouveau fichier qui contiendra le résultat et que tu alimenteras lui aussi au fur et à mesure ligne par ligne. (méthodes ReadLine et WriteLine).
    Pour chaque ligne du fichier d'origine tu extrais la taille de la ligne, et après un habile calcul, tu trouves le milieu de la ligne. Tu compares les chaînes à la moitié de la ligne. Si elles sont différentes tu écris la ligne telle quelle dans le fichier résultat, sinon tu écris juste la moitié de ligne. (pense aussi à gérer le truc de la taille minimale de la ligne.)

    Quand l'opération est terminée tu effaces le fichier d'origine File.Delete(...) (ou tu le renomme en bidule.bak) et tu le remplaces par l'autre File.Move(...,...) ou alors tu fais un File.Replace("original.txt", "result.txt", null) (Travaille sur des copies pour tes essais).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    Merci Pol63 et CosmoKnacki, en fait je me suis tellement pris la tête que je n'ai même pas envisagé un instant qu'une solution aussi simple que celle de Pol63 pourrait résoudre mon problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (line.Substring(line.Length / 2) == line.Substring(line.Length / 2, line.Length / 2))
        line = line.Substring(line.Length / 2);

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

Discussions similaires

  1. supprimer les doublons dans une table
    Par mavean dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 26/06/2019, 13h26
  2. supprimer un char dans un String
    Par raph707 dans le forum Langage
    Réponses: 11
    Dernier message: 30/01/2007, 22h55
  3. [String] supprimer un espace dans un String
    Par Zanton dans le forum Langage
    Réponses: 5
    Dernier message: 13/07/2006, 15h33
  4. [Collections]Supprimer des doublons dans une ArrayList
    Par emie31 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/12/2005, 15h15
  5. [vbexcel]Comment supprimer les doublons dans une combobox?
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 24/11/2005, 11h12

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