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.
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
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; } }
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
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.
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...
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
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
Bon dév.
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];
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
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
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.
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.
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
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
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(); }
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Bonjour,
Si on veut aller plus vite, autant partir de la fin du fichier.
Avec un truc qui ressemblerai a ça
A voir si ça marche avec tous les types d'encodage, notamment les fins de ligne qui varie d'un OS à l'autre.
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; }
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
Effectivement. J'avais évoqué l'idée mais j'ai eu la flemme de l'implémenter
Bah c'est ce qu'on te suggérait depuis le début...
Bah justement Antoine t'en a proposé une autre
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.
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
@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 de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
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é.
Il y a une petite astuce qui consiste à wrapper le stream dans un decorator comme ça qui empêche sa fermeture:
A mon avis il faut reculer dans le Stream jusqu'à ce que tu trouves soit un \r, soit un \n
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 ... }
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
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager