Existe-t-il un moyen simple de déterminer par programme le nombre de lignes d'un fichier texte ?
Pourquoi la deuxième méthode est-elle moins performante que la première ? Ce n'est pas apparent dans le code.
Existe-t-il un moyen simple de déterminer par programme le nombre de lignes d'un fichier texte ?
Modification sérieusement tardive : Si vous utilisez .NET 4.0 ou plus récent
Le site File
a une nouvelle classe ReadLines
qui énumère paresseusement les lignes plutôt que de les lire toutes dans un tableau comme le fait la méthode ReadAllLines
. Vous pouvez donc désormais allier efficacité et concision :
var lineCount = File.ReadLines(@"C:\file.txt").Count();
Réponse originale
Si vous ne vous souciez pas trop de l'efficacité, vous pouvez simplement écrire :
var lineCount = File.ReadAllLines(@"C:\file.txt").Length;
Pour une méthode plus efficace, vous pourriez faire :
var lineCount = 0;
using (var reader = File.OpenText(@"C:\file.txt"))
{
while (reader.ReadLine() != null)
{
lineCount++;
}
}
Edit : En réponse aux questions sur l'efficacité
La raison pour laquelle j'ai dit que le second était plus efficace concernait l'utilisation de la mémoire, pas nécessairement la vitesse. La première charge tout le contenu du fichier dans un tableau, ce qui signifie qu'elle doit allouer au moins autant de mémoire que la taille du fichier. La seconde se contente de boucler une ligne à la fois, de sorte qu'elle n'a jamais à allouer plus d'une ligne de mémoire à la fois. Ce n'est pas très important pour les petits fichiers, mais pour les fichiers plus importants, cela peut poser problème (si vous essayez de trouver le nombre de lignes d'un fichier de 4 Go sur un système 32 bits, par exemple, où il n'y a tout simplement pas assez d'espace d'adressage en mode utilisateur pour allouer un tableau de cette taille).
En termes de vitesse, je ne m'attendrais pas à ce qu'il y ait beaucoup de choses. Il est possible que ReadAllLines ait quelques optimisations internes, mais d'un autre côté, il peut avoir à allouer un gros morceau de mémoire. Je pense que ReadAllLines pourrait être plus rapide pour les petits fichiers, mais significativement plus lent pour les gros fichiers ; mais la seule façon de le savoir serait de le mesurer avec un chronomètre ou un profileur de code.
Pourquoi la deuxième méthode est-elle moins performante que la première ? Ce n'est pas apparent dans le code.
Petite note : parce que String est un type de référence, le tableau serait de la taille du nombre de lignes x la taille d'un pointeur, mais vous avez raison de dire qu'il faut toujours stocker le texte, chaque ligne comme un seul objet String.
Si par facile vous voulez dire une ligne de code facile à déchiffrer mais par hasard inefficace ?
string[] lines = System.IO.File.RealAllLines($filename);
int cnt = lines.Count();
C'est probablement le moyen le plus rapide de savoir combien de lignes il y a.
Vous pouvez également faire (selon que vous le mettez en mémoire tampon ou non)
#for large files
while (...reads into buffer){
string[] lines = Regex.Split(buffer,System.Enviorment.NewLine);
}
Il existe de nombreux autres moyens, mais l'un d'entre eux est probablement celui que vous choisirez.
Je soutiens que cette méthode est très inefficace, car vous lisez le fichier entier en mémoire, et dans un tableau de chaînes de caractères, rien de moins. Vous n'avez pas besoin de copier le tampon, lorsque vous utilisez ReadLine. Voir la réponse de @GregBeech. Désolé de gâcher votre plaisir.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.