web-dev-qa-db-fra.com

Comptage du nombre de lignes, de mots et de caractères dans un fichier texte

J'essaie de prendre les entrées d'un utilisateur et d'imprimer la quantité de lignes, de mots et de caractères d'un fichier texte. Cependant, seule la quantité de mots est correcte, il affiche toujours 0 pour les lignes et les caractères.

import Java.util.*;
import Java.io.*;

public class TextFileInfoPrinter
{  
    public static void main(String[]args) throws FileNotFoundException        
    { 
            Scanner console = new Scanner(System.in);           

            System.out.println("File to be read: ");
            String inputFile = console.next();

            File file = new File(inputFile);
            Scanner in = new Scanner(file);

            int words = 0;
            int lines = 0;
            int chars = 0;

            while(in.hasNext())
            {
                in.next();
                words++;
            }

            while(in.hasNextLine())
            {
                in.nextLine();
                lines++;
            }

            while(in.hasNextByte())
            {
                in.nextByte();
                chars++;
            }

            System.out.println("Number of lines: " + lines);
            System.out.println("Number of words: " + words);
            System.out.println("Number of characters: " + chars);
    }
}
4
user2138453

essayer

    int words = 0;
    int lines = 0;
    int chars = 0;
    while(in.hasNextLine())  {
        lines++;
        String line = in.nextLine();
        chars += line.length();
        words += new StringTokenizer(line, " ,").countTokens();
    }
6
Evgeniy Dorofeev

in.next(); utilise toutes les lignes de la première while(). Après la fin de votre première boucle while, il n'y a plus de caractères à lire dans le flux d'entrée.

Vous devriez imbriquer votre personnage et le décompte de mots dans un nombre de lignes de comptage de boucles while.

2

Je pense que la meilleure réponse est 

int words = 0;
int lines = 0;
int chars = 0;
while(in.hasNextLine())  {
    lines++;
    String line = in.nextLine();
   for(int i=0;i<line.length();i++)
    {
        if(line.charAt(i)!=' ' && line.charAt(i)!='\n')
        chars ++;
    }
    words += new StringTokenizer(line, " ,").countTokens();
}
1
khaled mamdoh

Y a-t-il une raison pour laquelle vous pensez que:

while(in.hasNext())
{
    in.next();
    words++;
}

not consommera-t-il l'intégralité du flux d'entrée?

Il va fais donc, ce qui signifie que vos deux autres boucles while ne seront jamais itératives. C'est pourquoi vos valeurs pour les mots et les lignes sont toujours définies sur zéro.

Il est probablement préférable de lire le fichier un caractère à la fois, en augmentant le nombre de caractères à chaque boucle et en détectant le caractère pour décider d’incrémenter ou non les autres compteurs.

En gros, partout où vous trouvez un \n, augmentez le nombre de lignes - vous devriez probablement le faire aussi si le dernier caractère du flux n'était pas \n.

Et, chaque fois que vous passez d'un espace blanc à un espace libre, augmentez le nombre de mots (il y aura probablement un traitement de cas Edge délicat au début du flux, mais c'est un problème d'implémentation).

Vous regardez quelque chose comme le pseudo-code suivant:

# Init counters and last character

charCount = 0
wordCount = 0
lineCount = 0
lastChar = ' '

# Start loop.

currChar = getNextChar()
while currChar != EOF:
    # Every character counts.

    charCount++;

    # Words only on whitespace transitions.

    if isWhite(lastChar) && !isWhite(currChar):
        wordCount++

    # Lines only on newline characters.

    if currChar == '\n':
        lineCount++;
    lastChar = currChar
    currChar = getNextChar()

# Handle incomplete last line.

if lastChar != '\n':
    lineCount++;
1
paxdiablo

Je ne suis pas un expert en Java, mais je suppose que les codes .hasNext, .hasNextLine et .hasNextByte utilisent et incrémentent le même indicateur de position de fichier. Vous devrez le réinitialiser, soit en créant un nouveau scanner, comme indiqué par Aashray, ou en utilisant RandomAccessFile et en appelant file.seek(0); après chaque boucle.

0
autistic

Je suis d'accord avec la réponse de @Cthulhu. Dans votre code, vous pouvez réinitialiser votre objet Scanner (in). 

in.reset();

Cela réinitialisera votre objet en première ligne de votre fichier.

0
Gunaseelan

Vous pouvez utiliser des expressions régulières pour compter pour vous.

String subject = "First Line\n Second Line\nThird Line";  
Matcher wordM = Pattern.compile("\\b\\S+?\\b").matcher(subject); //matches a Word
Matcher charM = Pattern.compile(".").matcher(subject); //matches a character
Matcher newLineM = Pattern.compile("\\r?\\n").matcher(subject); //matches a linebreak

int words=0,chars=0,newLines=1; //newLines is initially 1 because the first line has no corresponding linebreak

while(wordM.find()) words++;
while(charM.find()) chars++;
while(newLineM.find()) newLines++;

System.out.println("Words: "+words);
System.out.println("Chars: "+chars);
System.out.println("Lines: "+newLines);
0
deadlock
while(in.hasNextLine())  {
        lines++;
        String line = in.nextLine();
        for(int i=0;i<line.length();i++)
        {
            if(line.charAt(i)!=' ' && line.charAt(i)!='\n')
        chars ++;
        }
        words += new StringTokenizer(line, " ,;:.").countTokens();
    }
0
Manohar Ch

Le pointeur de fichier est placé à la fin du fichier lorsque le premier est exécuté. essaye ça:

Scanner in = new Scanner(file);


        while(in.hasNext())
        {
            in.next();
            words++;
        }
        in = new Scanner(file);
        while(in.hasNextLine())
        {
            in.nextLine();
            lines++;
        }
        in = new Scanner(file);
        while(in.hasNextByte())
        {
            in.nextByte();
            chars++;
        }
0
Aashray
import Java.io.*;
class wordcount
{
    public static int words=0;
    public static int lines=0;
    public static int chars=0;
    public static void wc(InputStreamReader isr)throws IOException
    {
        int c=0;
        boolean lastwhite=true;
        while((c=isr.read())!=-1)
        {
            chars++;
            if(c=='\n')
                lines++;
            if(c=='\t' || c==' ' || c=='\n')
                ++words;
            if(chars!=0)
                ++chars;
        }   
       }
    public static void main(String[] args)
    {
        FileReader fr;
        try
        {
            if(args.length==0)
            {
                wc(new InputStreamReader(System.in));
            }
            else
            {
                for(int i=0;i<args.length;i++)
                {
                    fr=new FileReader(args[i]);
                    wc(fr);
                }
            }

        }
        catch(IOException ie)
        {
            return;
        }
        System.out.println(lines+" "+words+" "+chars);
    }
}
0
krish