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 :

Suprimer une ligne avec plusieur fois le même caractère en c# dans un fichier .txt


Sujet :

C#

  1. #1
    Membre à l'essai

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Points : 14
    Points
    14
    Billets dans le blog
    1
    Par défaut Suprimer une ligne avec plusieur fois le même caractère en c# dans un fichier .txt
    Bonjour à tous,

    J'ai fini mon outil pour générer une suite logique qui fonctionne, cette suite et enrgistré dans un fichier .txt
    Je voudrais lire et controler le fichier .txt afin de supprimer toute les lignes contenant 4 fois ou plus le même caractère.
    Et supprimmer l'espace vide que la ligne a laissé.
    Quelque soit l'emplacement du caractère dans le numéros, chiffre ou lettre, le tout en hexadecimal.
    Je fait le travail manuellement et je veux que cela ce fasse automatiquement.
    (Voir si il ne serais pas plus juducieux de faire le contrôle en même temps que je génère les numéro de serie...)

    exemple :
    1A5F3A800001 <---- 4 FOIS le même caractère, la ligne est supprimé automatiquement.
    ------
    1A5F3A844444 <---- + de 4 FOIS le même caractère, la ligne est supprimé automatiquement.
    ----
    1A5F3A861111 <---- 4 FOIS le même caractère, la ligne est supprimé automatiquement.
    ----
    1A5F3A8613A29
    1A5F3A8613A2A <---- 4 FOIS le même caractère, la ligne est supprimé automatiquement.
    1A5F3A8613A2B
    1A5F3A8613A2C
    .....
    1A5F3ABB3ABB <---- 4 FOIS le même caractère, la ligne est supprimé automatiquement.
    ----
    1A5F3ACCBBBB <---- 4 FOIS le même caractère, la ligne est supprimé automatiquement.

    Merci pour votre aide.

  2. #2
    Max
    Max est déconnecté
    Expert éminent sénior

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Points : 14 933
    Points
    14 933
    Par défaut
    Salut

    Citation Envoyé par jarodova Voir le message
    Voir si il ne serais pas plus juducieux de faire le contrôle en même temps que je génère les numéro de serie...
    C'est ce qu'il y a de mieux à faire. Dans ton processus de génération de suite, tu boucles et génères un code hexa tant que tu n'as pas une chaîne valide, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public string Generate() {
        string output = ...; // Appel à ta méthode de génération du code hexa
        // Ici la condition veut dire "tant que cette chaîne contient au moins un caractère présent 4 fois ou plus"
        while (output.GroupBy(c => c).Select(c => new { Char = c.Key, Count = c.Count() }).Any(c => c.Count >= 4)) {
            output = ...; // Appel à ta méthode de génération du code hexa
        }
        return output;
    }

  3. #3
    Membre à l'essai

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Points : 14
    Points
    14
    Billets dans le blog
    1
    Par défaut J'ai un total de 32 Caractères.
    Citation Envoyé par Max Voir le message
    Salut


    C'est ce qu'il y a de mieux à faire. Dans ton processus de génération de suite, tu boucles et génères un code hexa tant que tu n'as pas une chaîne valide, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public string Generate() {
        string output = ...; // Appel à ta méthode de génération du code hexa
        // Ici la condition veut dire "tant que cette chaîne contient au moins un caractère présent 4 fois ou plus"
        while (output.GroupBy(c => c).Select(c => new { Char = c.Key, Count = c.Count() }).Any(c => c.Count >= 4)) {
            output = ...; // Appel à ta méthode de génération du code hexa
        }
        return output;
    }

    Bonjour,

    Pour mon générateur, j'ai du passer par plusieur Text box car j'ai un total de 32 caractère et en Hexa decimal, je suis au dessus des limites des possibilités,

    Pour contourner la limitation et afin de pouvoir générer 32 cractère en Hexadécimal, j'ai fais un text box avec un préfix determiné

    textbox1 = DCF00001138A000DF40 (est prédéfini)

    Richtextbox1 = textbox1 (DCF00001138A000DF40) + textbox2 = (1A5F3A8613A29)

    Richtextbox1 = DCF00001138A000DF401A5F3A8613A29

    Et apres, les lignes qui ce suivent dans la richtext box son enregister dans un fichier .txt

    Je crois que je devrais faire une suppression dans la Richtextbox1 non ?

    Ce serais plus simple non ?

  4. #4
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 905
    Points : 1 923
    Points
    1 923
    Par défaut
    Pas clair. Je sens que tu essaies de faire de façon détournée et compliquée quelque-chose qui peut se faire de façon plus directe et plus claire. Peux-tu nous préciser le problème de départ que tu cherches à résoudre ?

  5. #5
    Max
    Max est déconnecté
    Expert éminent sénior

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Points : 14 933
    Points
    14 933
    Par défaut
    Citation Envoyé par jarodova Voir le message
    Bonjour,

    Pour mon générateur, j'ai du passer par plusieur Text box car j'ai un total de 32 caractère et en Hexa decimal, je suis au dessus des limites des possibilités,

    Pour contourner la limitation et afin de pouvoir générer 32 cractère en Hexadécimal, j'ai fais un text box avec un préfix determiné

    textbox1 = DCF00001138A000DF40 (est prédéfini)

    Richtextbox1 = textbox1 (DCF00001138A000DF40) + textbox2 = (1A5F3A8613A29)

    Richtextbox1 = DCF00001138A000DF401A5F3A8613A29

    Et apres, les lignes qui ce suivent dans la richtext box son enregister dans un fichier .txt

    Je crois que je devrais faire une suppression dans la Richtextbox1 non ?

    Ce serais plus simple non ?
    Citation Envoyé par Noxen Voir le message
    Pas clair. Je sens que tu essaies de faire de façon détournée et compliquée quelque-chose qui peut se faire de façon plus directe et plus claire. Peux-tu nous préciser le problème de départ que tu cherches à résoudre ?
    Je rejoins Noxen : dès le départ ta méthode de génération est alambiquée. On te l'avait d'ailleurs déjà signalé ici (et proposé plusieurs pistes sur comment faire).

    Parmi les pistes proposées, manipuler des valeurs numériques classiques et n'utiliser l'héxadécimal que pour l'affichage, pouvoir utiliser 32 caractères en se servant des BigInteger. Un exemple bidon qui te génère toutes les chaînes de 00000000000000000000000000000000 à FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        string finalValue = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
        BigInteger value = BigInteger.Zero;
        string valueAsString = string.Empty;
        string format = "X32";
        while (valueAsString != finalValue) {
            valueAsString = value.ToString(format);
            value++;
        }

  6. #6
    Membre expert
    Profil pro
    Dév
    Inscrit en
    Juin 2007
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 162
    Points : 3 695
    Points
    3 695
    Par défaut
    Citation Envoyé par jarodova Voir le message
    Bonjour à tous,

    J'ai fini mon outil pour générer une suite logique qui fonctionne, cette suite et enrgistré dans un fichier .txt
    Je voudrais lire et controler le fichier .txt afin de supprimer toute les lignes contenant 4 fois ou plus le même caractère.
    Et supprimmer l'espace vide que la ligne a laissé.
    Quelque soit l'emplacement du caractère dans le numéros, chiffre ou lettre, le tout en hexadecimal.
    Je fait le travail manuellement et je veux que cela ce fasse automatiquement.
    (Voir si il ne serais pas plus juducieux de faire le contrôle en même temps que je génère les numéro de serie...)

    exemple :
    1A5F3A800001 <---- 4 FOIS le même caractère, la ligne est supprimé automatiquement.
    ------
    1A5F3A844444 <---- + de 4 FOIS le même caractère, la ligne est supprimé automatiquement.
    ----
    1A5F3A861111 <---- 4 FOIS le même caractère, la ligne est supprimé automatiquement.
    ----
    1A5F3A8613A29
    1A5F3A8613A2A <---- 4 FOIS le même caractère, la ligne est supprimé automatiquement.
    1A5F3A8613A2B
    1A5F3A8613A2C
    .....
    1A5F3ABB3ABB <---- 4 FOIS le même caractère, la ligne est supprimé automatiquement.
    ----
    1A5F3ACCBBBB <---- 4 FOIS le même caractère, la ligne est supprimé automatiquement.

    Merci pour votre aide.
    Je pense que c'est possible avec un tableau

    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
     
    public void Generate(string filePath, string outputFile)
    {
    	if (!File.Exists(path))
    	{
    		throw new FileNotFoundException("Fichier non trouvé!");
    	}
     
    	// Open the file to read from.
    	string[] lines = File.ReadAllLines(filePath);
    	List<string> res = new List<string>();
    	//je repompe le code du topic sans l'avoir testé mais je pense qu'il fonctionne en le lisant vite fait sinon essaie une Regex :D
    	foreach (string output  in lines)
    	{
    		if(!output.GroupBy(c => c).Select(c => new { Char = c.Key, Count = c.Count() }).Any(c => c.Count >= 4))
    		{
    			//Le trim sert à virer l'espace
    			res.Add(output.Trim());
    		}
    	}
    	File.WriteAllLines(outputFile, res.ToArray(), Encoding.UTF8);
     
    }

  7. #7
    Membre à l'essai

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Points : 14
    Points
    14
    Billets dans le blog
    1
    Par défaut Suite.
    Bonsoir,

    Pour résumer et revenir au début.
    A la base, je voulais faire incrémenter automatiquement avec +1 en Hexedecimal une text box contenant 32 caractères.
    En partant de 00000000000000000000000000000000 pour arriver à FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

    Comme je n'ai pas réussi à le faire avec les méthode suggéré dans les précédents posts, j'ai dont fait plusieurs textbox.
    Quand le textbox1 arrive à FF, la textbox2 passe à 01,
    Quand le textbox1 et 2 arrivent à FF, la textbox3 passe à 01 , ect...
    (Sauf erreur de ma part, on ne peux pas aller au dela de FFFFFFFFFFFFF EN HEXA soit 4503599627370495 en décimal... avec une textbox...)
    Pour finir, les textbox finissent dans une riche textbox et cela fonctionne.
    Il ne me sert à rien de revenir en arrière sur ce qui fonctionne, je cherche juste à supprimer, les lignes contenant plus de 4 fois le mème charactère dans le fichier .txt que j'ai crée.
    Si cela n'ai pas possible, c'est pas grave, jutiliserais une autre méthode.

    Je vais tester vos méthode et je vous tiens au courant.
    A bientôt.

  8. #8
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 905
    Points : 1 923
    Points
    1 923
    Par défaut
    Au final tu nous explique encore ta solution et non ton problème, tu ne nous dit pas pourquoi tu veux générer tous ces nombres. S'il s'agit juste de gérer des numéros / identifiants / matricules aléatoire il y a la classe Guid qui sert à ça. En outre à ta façon de mélanger dans tes propos nombre / chaine / décimal / hexadécimal montre que tu ne comprends pas réellement ce que tu es en train de faire. Non pas que je cherche à te vexer ou t'insulter en disant cela, ce n'est pas l'esprit de ce forum ; mais je trouve ta pensée confuse et je crois que tu gagnerais à mieux comprendre les concepts que tu manipules.

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Juste une petite suggestion.

    Plutôt que de faire du Linq pour essayer de compter les occurences de chaque caractère, je pense qu'il serait bien plus performant de :
    1/ trier les caractères de la chaîne
    2/ utiliser une regexp pour trouver 4 caractères identiques à la suite

    Je pense que ce serait à la fois moins consommateur en mémoire et en CPU.

    A tester.

  10. #10
    Max
    Max est déconnecté
    Expert éminent sénior

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Points : 14 933
    Points
    14 933
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Bonjour,

    Juste une petite suggestion.

    Plutôt que de faire du Linq pour essayer de compter les occurences de chaque caractère, je pense qu'il serait bien plus performant de :
    1/ trier les caractères de la chaîne
    2/ utiliser une regexp pour trouver 4 caractères identiques à la suite

    Je pense que ce serait à la fois moins consommateur en mémoire et en CPU.

    A tester.
    "bien plus performant" j'ai quand même de gros doutes J'ai la flemme de faire un benchmark mais le tri, comme le linq, va imposer de parcourir tous les caractères, ensuite une regex avec l'utilisation des références pour compter c'est pas réputé pour être ce qu'il y a de plus performant, etc. etc.

    J'ajouterai qu'ici l'auteur a bien d'autres soucis à régler avant de faire de l'optimisation de bouts de ficelle, parce qu'on parle pas d'un truc qui fait des calculs de fou ou d'un module d'alunissage mais bien d'enlever quelques lignes dans un fichier texte (ou plutôt de générer de façon plus pertinente des chaînes en hexa), donc même si c'était beaucoup plus performant je doute que l'utilisateur ressente une quelconque différence

  11. #11
    Membre à l'essai

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Points : 14
    Points
    14
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Au final tu nous explique encore ta solution et non ton problème, tu ne nous dit pas pourquoi tu veux générer tous ces nombres. S'il s'agit juste de gérer des numéros / identifiants / matricules aléatoire il y a la classe Guid qui sert à ça. En outre à ta façon de mélanger dans tes propos nombre / chaine / décimal / hexadécimal montre que tu ne comprends pas réellement ce que tu es en train de faire. Non pas que je cherche à te vexer ou t'insulter en disant cela, ce n'est pas l'esprit de ce forum ; mais je trouve ta pensée confuse et je crois que tu gagnerais à mieux comprendre les concepts que tu manipules.
    Bonjour,

    Je veux tout simplement créer mes propre numéros de serie pour les attribuer à des licences.
    Les numéros de licence auront un total de 32 Charactère mais le tout en Hexadecimal.
    les clée seront stocké sur une base de données et seront attribué à une adresse IP Unique.
    Sur les 32 Caractère, seul les 14 dernière caractère ne doivent pas aparaitre plus de 4 fois ou plus.

    Faire de l'aléatoire je sais le faire ... mais ce n'est pas ce que je veux.
    Et si je demande de l'aide c'est effectivement parceque je ne maitrise pas "les concepts que je manipule" ... Sinon, je ne serais pas ici.

    Bref, je vais tester le Regex et je verrais bien.

    Merci tout de même.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 243
    Points : 12 874
    Points
    12 874
    Par défaut
    Bonjour,
    Pourquoi ne pas attaquer le problème à la base: la génération ?
    Tu stockes l'ensemble des caractères utilisables dans une liste: si tu peux avoir 3 fois le A, tu le mets 3 fois dans la liste.
    Ensuite tant que ta chaine générée ne fait pas la bonne longueur:
    1. Tu prends un élément au hasard dans la liste
    2. Tu ajoutes le caractère correspondant à ta chaine
    3. Tu supprimes l'élément de la liste

    Ainsi tu es sûr de ne pas avoir plus de 3 fois le même caractère.
    C'est simple et rapide à faire, pas de Linq, pas de tri, pas de Regex.

    Tatayo.

Discussions similaires

  1. [MySQL] Formulaire avec plusieurs fois le même champ et récupération des valeurs
    Par aunisien dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 21/09/2016, 19h43
  2. [XL-2013] SOMMEPROD sur une ligne avec plusieurs dates
    Par Sudeki dans le forum Excel
    Réponses: 2
    Dernier message: 07/02/2015, 14h20
  3. Ecriture dans une ligne en plusieurs fois
    Par mohammed.badre dans le forum Débuter
    Réponses: 3
    Dernier message: 19/12/2011, 17h57
  4. Réponses: 5
    Dernier message: 27/08/2010, 07h29
  5. Réponses: 4
    Dernier message: 04/09/2007, 08h55

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