238 votes

Déterminer le nombre de lignes dans un fichier texte

Existe-t-il un moyen simple de déterminer par programme le nombre de lignes d'un fichier texte ?

445voto

Greg Beech Points 55270

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.

0 votes

Pourquoi la deuxième méthode est-elle moins performante que la première ? Ce n'est pas apparent dans le code.

0 votes

Mon intuition me dit que le premier est plus rapide, mais c'est juste une supposition.

2 votes

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.

13voto

leppie Points 67289

Le plus facile :

int lines = File.ReadAllLines("myfile").Length;

8voto

benPearce Points 9817

Cela utiliserait moins de mémoire, mais prendrait probablement plus de temps.

int count = 0;
string line;
TextReader reader = new StreamReader("file.txt");
while ((line = reader.ReadLine()) != null)
{
  count++;
}
reader.Close();

5voto

user8456 Points 130

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.

4 votes

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.

1voto

geocoin Points 580

Compter les retours de chariot et les sauts de ligne. Je crois qu'en unicode, ils sont toujours 0x000D et 0x000A respectivement. De cette façon, vous pouvez être aussi efficace ou inefficace que vous le souhaitez, et décider si vous devez gérer les deux caractères ou non.

Prograide.com

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.

Powered by:

X