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 :

Recherche de chaîne de caractères dans fichier txt


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Electronicien
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Electronicien
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut Recherche de chaîne de caractères dans fichier txt
    Bonjour à tous
    Je cherche à extraire une chaîne de caractères qui se situe dans un fichier texte
    La chaîne cherchée ne sera jamais à la même adresse dans le fichier

    J'ai testé diverses solutions trouvées sur le net mais rien de concluant

    Voici un extrait de ce qu'on peut trouver dans le fichier texte à analyser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fri 02 Nov 2018  21:00:16 < 61C003CFF6F8ADFFFCC
    Il faut chercher dans tout le fichier un ligne qui contient "< 61C0"
    Quand cette ligne est trouvée, il faut copier toute cette chaîne "61C0..........."


    Voici un bout de code qui me permet de trouver la ligne mais je n'arrive pas à extraire simplement ce qui suit car ça peut arriver que la chaine cherchée se trouve à des offsets différents

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                string chaine_a_trouver = "< 61C0";
     
                string[] lines = System.IO.File.ReadAllLines(@"C:\file.log");
     
                foreach (string line in lines)
                {
     
                    foreach (Match match in Regex.Matches(line, chaine_a_trouver)) // cherche la ligne contenant la chaine à trouver
                    {
                        String input = line; // Ca affiche la ligne complète où 61C0 à été trouvé
                        string Chaine_decoupee= input.Substring(28, 19); // commence à lire à la 28ème position de la ligne et les 19 caractères
                    }
    Merci d'avance à tous ceux qui pourrons m'aider

  2. #2
    Max
    Max est déconnecté
    Expert confirmé

    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

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

    Un exemple avec une regex et un groupe nommé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    string regexNamedGroup = "toKeep";
    string regexPattern = @"^(?:.*(?:\<\s(?<" + regexNamedGroup + @">61C0.*)))$";
    Regex regex = new Regex(regexPattern, RegexOptions.Compiled);
    using (StreamReader reader = new StreamReader(@"...")) {
        string currentLine;
        Match currentMatch;
        while ((currentLine = reader.ReadLine()) != null) {
            currentMatch = regex.Match(currentLine);
            if (currentMatch.Success) {
                Console.WriteLine(currentMatch.Groups[regexNamedGroup].Value);
            }
        }
    }
    La regex entière ça donne ^(?:.*(?:\<\s(?<toKeep>61C0.*)))$ :

    • ^ : début de chaîne ;
    • (?: ... ) : un groupe dont on ne capture pas le contenu ;
    • .* : n'importe quoi 0 fois ou plus ;
    • \<\s : < échappé avec \ suivi d'un espace ;
    • (?<toKeep> .... ) : le groupe nommé dont on va capturer le contenu (évite d'utiliser un index numérique qui peut changer si tu ajoutes/retires des groupes) ;
    • 61C0.* : le début de chaîne que tu cherches suivi de n'importe quoi ;
    • $ : fin de chaîne.

  3. #3
    Membre averti
    Homme Profil pro
    Electronicien
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Electronicien
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut
    Super

    Merci beaucoup
    Votre bout de code est parfait
    ça fait exactement ce que je cherchais

  4. #4
    Membre averti
    Homme Profil pro
    Electronicien
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Electronicien
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut
    Maintenant que ça fonctionne pour une chaîne précise et que j'arrive à l'afficher dans une textebox, je voudrais étendre ça à plusieurs chaines
    Par exemple, je voudrais chercher dans mon fichier log toutes les chaines suivantes 61C0, 61C1, 61C2, ...

    Je ne vois pas comment procéder pour que le code soit "light" et facilement modifiable en fonction des chaines recherchées (dans le style de mon code de départ) ?

    Merci

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Il faut remplacer 61C0 par 61C[0-9] ("un chiffre parmi les chiffres de 0 à 9") ou par 61C\d ("un chiffre quelconque" ; vérifier pour le caractère d'échappement).

  6. #6
    Membre averti
    Homme Profil pro
    Electronicien
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Electronicien
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Il faut remplacer 61C0 par 61C[0-9] ("un chiffre parmi les chiffres de 0 à 9") ou par 61C\d ("un chiffre quelconque" ; vérifier pour le caractère d'échappement).
    Oui, merci mais j'ai une vingtaine de chaines à rechercher dans le fichier log puis à extraire
    je ne voudrais donc pas mettre 15 lignes de code par recherche à faire

    ça doit être possible de définir les "pattern" en début de code (comme variable) puis faire un boucle qui recherche toutes les pattern ?

Discussions similaires

  1. [Débutant] Recherche chaîne de caractères dans un .txt
    Par MaxLikeMilf dans le forum C#
    Réponses: 5
    Dernier message: 20/09/2018, 15h26
  2. [PowerShell] Rechercher une chaîne de caractères dans un fichier texte
    Par 69Pierre dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/07/2018, 19h02
  3. Réponses: 2
    Dernier message: 17/01/2010, 02h01
  4. Rechercher une chaîne de caractère dans une série de fichier
    Par Edoxituz dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/02/2006, 13h51
  5. Réponses: 3
    Dernier message: 09/05/2002, 02h39

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