85 votes

Comment puis-je obtenir le nombre de lignes dans un fichier de manière efficace ?

J'ai un gros dossier. Il comprend environ 3.000-20.000 lignes. Comment puis-je obtenir le nombre total de lignes dans le fichier en utilisant Java ?

1 votes

D'après vos commentaires sur les réponses, le mot que vous recherchez est "efficient", et non "efficace".

0 votes

@Firstthumb : S'il vous plaît, ne supprimez pas les commentaires après les gens y ont répondu. Cela rend le fil de discussion confus pour les personnes qui arrivent en retard au spectacle.

0 votes

Pourquoi ? 20 000 lignes, ce n'est pas énorme. Des millions, c'est énorme. Pourquoi pensez-vous avoir besoin de connaître le nombre de lignes ? Si vous le savez, vous pouvez les compter pendant que vous les traitez. Vous devez lire le fichier entier juste pour compter les lignes. Vous pouvez aussi bien faire quelque chose d'utile en même temps.

131voto

Mnementh Points 19831
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
int lines = 0;
while (reader.readLine() != null) lines++;
reader.close();

Mise à jour : Pour répondre à la question de la performance soulevée ici, j'ai effectué une mesure. Première chose : 20.000 lignes sont trop peu, pour que le programme fonctionne pendant un temps appréciable. J'ai créé un fichier texte de 5 millions de lignes. Cette solution (lancée avec java sans paramètres comme -server ou -XX-options) a nécessité environ 11 secondes sur ma machine. La même chose avec wc -l (outil de ligne de commande UNIX pour compter les lignes), 11 secondes. La solution consistant à lire chaque caractère et à rechercher ' \n Il a fallu 104 secondes, soit 9 à 10 fois plus.

0 votes

Quelle efficacité voulez-vous dire ? De la performance ? Dans ce cas, vous n'aurez pas de meilleur moyen, parce que les lignes peuvent avoir des longueurs différentes, vous devrez lire le fichier complet, pour compter les numéros de ligne (wc le fait aussi). Si vous parlez d'efficacité de programmation, je suis sûr que vous pouvez le faire dans une méthode utilitaire (ou une bibliothèque commune l'a déjà fait).

0 votes

@Firstthumb. Pas efficace peut-être, mais peu importe. Il ne compte que 20k lignes, ce qui est assez peu. Ce code obtient mon vote pour être le plus simple.

0 votes

Qu'en est-il de l'efficacité de LineNumberReader puisqu'il étend BufferedReader ?

33voto

Narayan Points 1985

Utilice LineNumberReader

quelque chose comme

public static int countLines(File aFile) throws IOException {
    LineNumberReader reader = null;
    try {
        reader = new LineNumberReader(new FileReader(aFile));
        while ((reader.readLine()) != null);
        return reader.getLineNumber();
    } catch (Exception ex) {
        return -1;
    } finally { 
        if(reader != null) 
            reader.close();
    }
}

3 votes

Vous devrez probablement aussi fermer() le lecteur.

3 votes

Vous devrez probablement vérifier si reader!=null dans le bloc finally.

13voto

brig Points 540

J'ai trouvé une solution à ce problème, elle pourrait vous être utile.

Voici un extrait de code pour compter le nombre de lignes du fichier.

  File file = new File("/mnt/sdcard/abc.txt");
  LineNumberReader lineNumberReader = new LineNumberReader(new FileReader(file));
  lineNumberReader.skip(Long.MAX_VALUE);
  int lines = lineNumberReader.getLineNumber();
  lineNumberReader.close();

1 votes

Le résultat est des lignes count - 1

1 votes

En fait, le résultat est lines + 1

0 votes

Le résultat est getLineNumber() plus 1 car l'index de la ligne commence à 0

5voto

Esko Luontola Points 53877

Lisez le fichier en entier et comptez le nombre de caractères de nouvelle ligne. Une façon simple de lire un fichier en Java, une ligne à la fois, est la méthode suivante java.util.Scanner classe.

4voto

ZZ Coder Points 36990

C'est à peu près aussi efficace que possible, lecture binaire en mémoire tampon, pas de conversion de chaîne,

FileInputStream stream = new FileInputStream("/tmp/test.txt");
byte[] buffer = new byte[8192];
int count = 0;
int n;
while ((n = stream.read(buffer)) > 0) {
    for (int i = 0; i < n; i++) {
        if (buffer[i] == '\n') count++;
    }
}
stream.close();
System.out.println("Number of lines: " + count);

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