2010-01-20 7 views
1

Je veux savoir combien de lignes j'ai dans mon fichier. Comment puis-je le faire d'une manière simple (je veux dire, ne pas passer en revue tous les fichiers et compter chaque ligne)? Y a-t-il une commande pour ça?Comptez les lignes de fichier en C#

+0

Partout dans le fichier? Nous parlons de 3 lignes de code pour le compter. –

Répondre

9

bien:

int lines = File.ReadAllLines(path).Length; 

est assez simple, mais pas très efficace pour les fichiers texte énormes. Je serais probablement utiliser un TextReader dans la plupart des cas, pour éviter tampon excessive:

int lines = 0; 
using (TextReader reader = File.OpenText(path)) { 
    while (reader.ReadLine() != null) { lines++; } 
} 
+0

réservoirs !!!! Au fait, je l'ai utilisé pour un fichier avec 65500 lignes, donc je pense que ça vaut même pour les fichiers de bogues ... – aharon

4

Toute « fonction » que vous appelez va faire essentiellement la même chose - aller ligne par ligne et compter le nombre de nouvelle ligne personnages.

Si vous voulez vous faire croire que quelque chose semble plus "crisp", une expression regex pour compter le nombre de caractères de nouvelle ligne ferait l'affaire.

+0

Une fois que vous avez lu le fichier entier - pas vraiment réalisable si c'est gros. Ou vous le faites par ligne ... oh attendez ... ;-) –

+0

Devrions-nous dire à l'OP que cela va encore lire le fichier entier? ;) Je suppose que s'il y avait des métadonnées attachées au fichier qui suivait le nombre de lignes (cela ne s'appliquerait probablement qu'aux fichiers texte) alors vous pourriez juste lire cela. Mais je ne pense pas qu'une telle chose existe. – FrustratedWithFormsDesigner

0

D'une manière ou d'une autre (Regex, FileStream etc.) quelque chose, quelque part devra passer par les nouvelles lignes.

0

dépend de la longueur de la ligne ... généralement le moyen le plus rapide est de le faire en utilisant cette formule simple - obtenir la longueur du fichier en octets et divisé par la longueur de la ligne, par exemple:

 
const int LINE_LENGTH = 80; 
System.IO.FileInfo f = new System.IO.FileInfo(path); 
int noLines = f.Length/LINE_LENGTH; 

qui précède suppose la longueur de la ligne est une largeur de 80 caractères constants ...

Si la longueur est variable, il n'y a pas d'autre moyen de le faire, en dehors de l'ouverture du fichier et itérer chaque ligne et garder une trace du nombre de lignes.

Edit: Je viens de réaliser un beaucoup plus facile après avoir posté un commentaire ci-dessous .. Ne serait-il pas plus facile à utiliser effectivement l'espace de noms Shell sous System.Diagnostics.Process d'invoquer grep -c "$(\r?\n?|\n)" en utilisant un argument que le chemin du fichier en question - cela le rendrait plus flexible et pourrait répondre à n'importe quel dossier. La seule chose que vous avez à faire est lu dans la sortie et regex pour obtenir le nombre réel de lignes, par exemple, en utilisant mon grep qui est venu avec Borland C, je reçois cette sortie

 
C:\Documents and Settings\Tom>grep -c "$(\r?\n?)" 273.txt 
File 273.txt: 
35 lines match 

La sortie et le kilométrage peut varier, la commande -c passer à grep signifie «nombre de»

+0

Et il suppose un codage ASCII ou UTF8 bas de gamme, plus il ne tient pas compte de la longueur des caractères de nouvelle ligne eux-mêmes. –

+0

la longueur des lignes est vérifiable et longue de 80 caractères. merci quand même .. – aharon

+0

Hey, qui va ouvrir un fichier avec des lignes de + 65k, comptez-les, puis comparez-le aux résultats de ce code? Je dis le mettre là et le changer si quelqu'un soumet un rapport de bogue. – Will

Questions connexes