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 :

[C#]Comment lire dernière ligne du fichier sans parcourir?


Sujet :

C#

  1. #1
    Membre du Club Avatar de aeled
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 84
    Points : 51
    Points
    51
    Par défaut [C#]Comment lire dernière ligne du fichier sans parcourir?
    Tout est dans le titre. Est-ce que ceci est possible ? Gestion de curseur ?

    Les fichiers textes que je traite font plus de 200Mo... J'aimerais bien ne pas avoir à les parcourir pour récupérer une date sur la denière ligne

  2. #2
    Membre du Club Avatar de Manralf
    Inscrit en
    Août 2005
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 43
    Points : 48
    Points
    48
    Par défaut
    Peut-être que la méthode Seek() de la classe Stream te sera utile :

  3. #3
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Bonjour aeled
    Pour y arriver notamment selon la suggestion de Manralf, il te faut une petite fonction qui te retourne la position de debut de la dernière ligne. Ceci n'est gérable que si déjà le fichier ne se termine au maximum que par un seul retour à la ligne
    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
     
    private static long FindLastLinePosition(BinaryReader br)
    {
       long index = br.BaseStream.Length - 2;
       char repere = '\n';
       br.BaseStream.Position = index;
       char current = br.ReadChar();
       while (!(current.Equals(repere)))
       {
          index -= 1;
          br.BaseStream.Position = index;
          current = br.ReadChar();
       }
       return index + 1;
    }
    Ensuite il ne reste plus qu'à t'en servir
    Exemple Test-Console
    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
     
    public static void Main(string[] args)
    { GetLastLine();}
     
    private static void GetLastLine()
    {
       string path = @"C:\rapport.txt";
       BinaryReader br = null;
       StreamReader sr = null;
       long position;
     
       //test pour la recupération de la position
       br = new BinaryReader(File.Open(path, FileMode.Open));
       position = FindLastLinePosition(br);
       Console.WriteLine("position : " + position.ToString());
       br.Close();
     
       //test pour lire juste la dernière ligne
       sr = new StreamReader(File.Open(path, FileMode.Open));
       sr.BaseStream.Position = position;
       Console.WriteLine(sr.ReadLine());			
    }
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  4. #4
    Membre du Club Avatar de aeled
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 84
    Points : 51
    Points
    51
    Par défaut
    Le code fonctionne. En revanche, il faut que je trouve une solution pour cette histoire de un seul retour chariot car ce n'est pas toujours le cas :s

  5. #5
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Il faudra alors donc modifié quelque peu en ajoutant une autre fonctionnalité qui verifie la fin de fichier pour determiner le nombre de retour à la ligne
    Soit modifier ainsi par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private static long FindLastLinePosition(BinaryReader br, long start)
    {
       br.BaseStream.Position = start;
       char current = br.ReadChar();
       while (!(current.Equals('\n')))
       {
          start -= 1;
          br.BaseStream.Position = start;
          current = br.ReadChar();
       }
       return (start + 1);
    }
    Puis ajouter ceci par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private static long WithoutReturnPosition(BinaryReader br)
    {
       long index = br.BaseStream.Length - 1;
       br.BaseStream.Position = index;
       int current = (int)br.ReadChar();
       while ((current == 10)||(current == 13))
       {
          index -= 1;
          br.BaseStream.Position = index;
          current = (int)br.ReadChar();
       }
       return (index - 1) ;		
    }
    Donc a tester ainsi par exemple
    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
     
    private static void GetLastLine()
    {
       string path = @"C:\rapport.txt";
       BinaryReader br = null;
       StreamReader sr = null;
       long position;
     
       br = new BinaryReader(File.Open(path, FileMode.Open));
       position = WithoutReturnPosition(br);
       position = FindLastLinePosition(br,position);
       br.Close();
       sr = new StreamReader(File.Open(path, FileMode.Open));
       sr.BaseStream.Position = position;
       Console.WriteLine(sr.ReadLine());
       sr.Close();
    }
    Ici j'ai separé les fonctionnalités afin d'être clair mais tu pourrais très bien intégré le code de WithoutReturnPosition dans FindLastLinePosition histoire de ne faire que cet appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sr.BaseStream.Position = FindLastLinePosition(path);
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  6. #6
    Membre du Club Avatar de aeled
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 84
    Points : 51
    Points
    51
    Par défaut
    Parfait, je place le tag résolu

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

Discussions similaires

  1. lire Dernière ligne d'un fichier
    Par avigeilpro dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 13/05/2011, 12h33
  2. Comment lire la ligne exact d'un fichier?
    Par xXO--Hades--OXx dans le forum Android
    Réponses: 2
    Dernier message: 31/01/2011, 14h40
  3. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 13h20
  4. Réponses: 6
    Dernier message: 15/04/2008, 00h38
  5. Réponses: 4
    Dernier message: 28/10/2005, 09h59

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