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 :

accès à la dernière ligne d'un fichier


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 84
    Points : 38
    Points
    38
    Par défaut accès à la dernière ligne d'un fichier
    Bonjour à tous,
    Je veux bien accéder à la dernière ligne d'un fichier pour effectuer la dessous un traitement. est ce qu'il y a une méthode en C# pour en utiliser?
    Merci par avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Citation Envoyé par khalil.ajmi Voir le message
    Bonjour à tous,
    Je veux bien accéder à la dernière ligne d'un fichier pour effectuer la dessous un traitement. est ce qu'il y a une méthode en C# pour en utiliser?
    Merci par avance.
    Si c'est pour rajouter du texte a la fin du fichier c'est avec File.AppendText(string path)
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Pour récupérer la dernière ligne tu peux faire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    string GetLastLine(string path)
    {
        using (var reader = new StreamReader(path))
        {
            string result = null;
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                result = line;
            }
            return result;
        }
    }

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 84
    Points : 38
    Points
    38
    Par défaut
    Merci pour vos réponse:
    en fait je veux bien lire juste la dernière ligne je ne veux pas parcourir le fichier en entier ligne par ligne.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par khalil.ajmi Voir le message
    en fait je veux bien lire juste la dernière ligne je ne veux pas parcourir le fichier en entier ligne par ligne.
    Ce n'est pas possible ; vu que tu ne sais pas à l'avance où se termine chaque ligne, tu est obligé de parcourir le fichier pour trouver toutes les fins de ligne.

    A la rigueur, il serait possible de partir de la fin du fichier pour trouver la fin de l'avant-dernière ligne, mais c'est nettement plus complexe...

  6. #6
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Bonjour,

    Il me semble déjà avoir utilisé le code suivant, mais cela implique la lecture du fichier complet en mémoire, en termes d'optimisation c'est pas le top

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    string[] lignesDuFichier = File.ReadAllLines("monfichier.txt"/*, monEncodage*/);
     
    //  Dernière ligne
    string derniereLigne = lignesDuFichier[lignesDuFichier.Length - 1];
    Bon dév.

    EDIT : Le code que t'as founi TomLev est mieux tout de même...
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Je crois que ReadAllLines est plus rapide mais est plus gourmand en mémoire vu que tu charges tout le fichier en mémoire
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par sisqo60 Voir le message
    Il me semble déjà avoir utilisé le code suivant, mais cela implique la lecture du fichier complet en mémoire, en termes d'optimisation c'est pas le top
    D'où ma méthode qui lit tout le fichier, mais ligne par ligne, donc ça ne charge pas tout le fichier en mémoire en même temps.

    Citation Envoyé par BenoitM Voir le message
    Je crois que ReadAllLines est plus rapide mais est plus gourmand en mémoire vu que tu charges tout le fichier en mémoire
    Plus rapide que quoi ? A priori ma méthode fait à peu près la même chose, sauf qu'elle n'a pas besoin d'allouer un tableau qu'il faut agrandir quand il est plein... donc elle est probablement plus rapide.

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    A cause du buffer de lecture que j'imagine plus grand mais je n'ai vu nulle part la taille du buffer utilisé pour la lecture.

    Donc si on veut vraimment jouer sur la rapidité de lecture on peut utilisr ta méthode et préciser un buffer plus grand dans le new StreamReader()
    Ca nous permet de jouer plus finement sur Rapidité lecture/Mémoire utilisé
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    File.ReadAllLines utilise la taille de buffer par défaut. Voilà l'implémentation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        private static string[] InternalReadAllLines(string path, Encoding encoding)
        {
          List<string> list = new List<string>();
          using (StreamReader streamReader = new StreamReader(path, encoding))
          {
            string str;
            while ((str = streamReader.ReadLine()) != null)
              list.Add(str);
          }
          return list.ToArray();
        }

  11. #11
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Si on veut aller plus vite, autant partir de la fin du fichier.
    Avec un truc qui ressemblerai a ça
    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
    public static string GetLastLine(this Stream src)
    {
        string ret = string.Empty;
        using (StreamReader reader = new StreamReader(src))
        {
            byte[] chariotReturn = reader.CurrentEncoding.GetBytes(new char[] { '\n' });
     
            if (chariotReturn == null)
                return ret;
     
            long initPosition = src.Position; //Sauvegarde la position initial
            src.Seek(0, SeekOrigin.End); //On va a la fin du fichier
     
            while (src.Seek(-chariotReturn.Length, SeekOrigin.Current) > 0) //On remonte dans le fichier
            {
                int i;
                for (i = 0; i < chariotReturn.Length; ++i)
                {
                    if (src.ReadByte() != chariotReturn[i]) //attention ReadByte provoque un mouvement
                        break;
                }
                if (i >= chariotReturn.Length)
                    break;
     
                src.Seek(-chariotReturn.Length, SeekOrigin.Current); //On retourne ou on etait
            }
     
            ret = reader.ReadToEnd(); //Lecture de la ligne
     
            src.Seek(initPosition, SeekOrigin.Begin); //retour a la position initial
        }
     
        return ret;
    }
    A voir si ça marche avec tous les types d'encodage, notamment les fins de ligne qui varie d'un OS à l'autre.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 84
    Points : 38
    Points
    38
    Par défaut
    Merci pour vos réponse,
    en fait j'ai réglé le problème: j'ai juste implémenté une boucle while tout en lisant le fichier ligne par ligne (je n'ai pas eu d'autre solution) et incrémentant un compteur, j'ai auparavant calculé le nombre de totale des lignes, donc si le compteur est égale au nombre totale des ligne je fais mon traitement

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par antoine.debyser Voir le message
    Si on veut aller plus vite, autant partir de la fin du fichier.
    Effectivement. J'avais évoqué l'idée mais j'ai eu la flemme de l'implémenter

    Citation Envoyé par khalil.ajmi Voir le message
    en fait j'ai réglé le problème: j'ai juste implémenté une boucle while tout en lisant le fichier ligne par ligne
    Bah c'est ce qu'on te suggérait depuis le début...

    Citation Envoyé par khalil.ajmi Voir le message
    (je n'ai pas eu d'autre solution)
    Bah justement Antoine t'en a proposé une autre

    Citation Envoyé par khalil.ajmi Voir le message
    et incrémentant un compteur, j'ai auparavant calculé le nombre de totale des lignes, donc si le compteur est égale au nombre totale des ligne je fais mon traitement
    Et comment tu calcules le nombre de lignes ? En parcourant toutes les lignes ? Dans ce cas tu le fais 2 fois... pas très efficace.

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    @antoine, par contre fait gaffe avec ta solution, je pense que c'est un peu dangereux de faire des Seek sur le flux alors qu'il y a un StreamReader par dessus... Le StreamReader utilise un buffer, donc si tu changes la position dans le flux ça risque de foutre la zone (d'un autre côté, vu que tu n'appelles pas Read sur le reader avant d'avoir fini de bidouiller la position, il n'a sans doute pas encore bufferisé quoi que ce soit...)

  15. #15
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par tomlev Voir le message
    @antoine, par contre fait gaffe avec ta solution, je pense que c'est un peu dangereux de faire des Seek sur le flux alors qu'il y a un StreamReader par dessus... Le StreamReader utilise un buffer, donc si tu changes la position dans le flux ça risque de foutre la zone (d'un autre côté, vu que tu n'appelles pas Read sur le reader avant d'avoir fini de bidouiller la position, il n'a sans doute pas encore bufferisé quoi que ce soit...)
    Pas con, j'avais pas du tous pensé à verifier l'implementation du reader.
    Mais de toute façons je me suis apercu que fermer le StreamReader, ferme le stream. Du coup je vois pas comment liberer mon reader sans fermer le stream.

    Et je confirme qu'avec le charactère de fin de ligne à la MAC ('\r') ça marche pas. Je vois pas comment détecter quel caractère de fin de ligne utilisé.

  16. #16
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Citation Envoyé par antoine.debyser Voir le message
    Et je confirme qu'avec le charactère de fin de ligne à la MAC ('\r') ça marche pas. Je vois pas comment détecter quel caractère de fin de ligne utilisé.
    Avec Environment.NewLine je pense
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par antoine.debyser Voir le message
    Mais de toute façons je me suis apercu que fermer le StreamReader, ferme le stream. Du coup je vois pas comment liberer mon reader sans fermer le stream.
    Il y a une petite astuce qui consiste à wrapper le stream dans un decorator comme ça qui empêche sa fermeture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    using (Stream streamQuIlFautPasFermer = ...)
    {
        using (Stream wrapper = new NonClosingStreamWrapper(streamQuIlFautPasFermer))
        using (TextReader reader = new StreamReader(wrapper))
        {
            // utiliser le reader ...
        }
     
        // continuer à utiliser streamQuIlFautPasFermer ...
     
    }
    Citation Envoyé par antoine.debyser Voir le message
    Et je confirme qu'avec le charactère de fin de ligne à la MAC ('\r') ça marche pas. Je vois pas comment détecter quel caractère de fin de ligne utilisé.
    A mon avis il faut reculer dans le Stream jusqu'à ce que tu trouves soit un \r, soit un \n

    Citation Envoyé par BenoitM Voir le message
    Avec Environment.NewLine je pense
    Oui mais non en fait
    Rien n'empêche de faire sous Windows un fichier avec des retours chariot Mac (\r) ou Unix (\n), et si tu utilises Environment.NewLine tu ne les détecteras pas

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

Discussions similaires

  1. SPOOL : Effacer dernière ligne vide du fichier.
    Par Ujitsu dans le forum Sql*Plus
    Réponses: 6
    Dernier message: 30/07/2007, 18h15
  2. lire les X dernières lignes d'un fichier.
    Par Empty_body dans le forum Langage
    Réponses: 6
    Dernier message: 13/06/2007, 11h58
  3. Effacer la dernière ligne d'un fichier texte
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/05/2007, 11h52
  4. Supprimer 1ère et dernière ligne d'un fichier
    Par yabbiyou dans le forum MATLAB
    Réponses: 3
    Dernier message: 02/03/2007, 09h05
  5. Comment lire la dernière ligne d'un fichier text.
    Par Ardely dans le forum Delphi
    Réponses: 29
    Dernier message: 20/01/2007, 23h29

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