web-dev-qa-db-fra.com

Compter le nombre de mots dans un fichier

Je ne parviens pas à compter le nombre de mots d'un fichier. L'approche que je suis en train de faire est de voir un espace ou une nouvelle ligne, alors je sais compter un mot.

Le problème est que si j'ai plusieurs lignes entre les paragraphes, je finis par les compter également comme des mots. Si vous regardez la méthode readFile (), vous pouvez voir ce que je fais. 

Pourriez-vous m'aider et me guider dans la bonne direction pour résoudre ce problème?

Exemple de fichier d'entrée (y compris une ligne vide):

Word word Word
word Word

Word word Word
7
Tony

Je changerais un peu votre approche. Premièrement, j'utiliserais une variable BufferedReader pour lire le fichier fichier ligne par ligne à l'aide de readLine(). Puis divisez chaque ligne avec des espaces à l’aide de String.split("\\s") et utilisez la taille du tableau obtenu pour voir le nombre de mots sur cette ligne. Pour obtenir le nombre de caractères, vous pouvez soit regarder la taille de chaque ligne ou de chaque mot divisé (selon que vous souhaitiez compter les espaces blancs comme des caractères).

10
Brian Clements

Vous pouvez utiliser un scanner avec FileInputStream au lieu de BufferedReader avec un FileReader. Par exemple:-

File file = new File("sample.txt");
try(Scanner sc = new Scanner(new FileInputStream(file))){
    int count=0;
    while(sc.hasNext()){
        sc.next();
        count++;
    }
System.out.println("Number of words: " + count);
}
11
tanyehzheng

Ceci est juste une pensée. Il existe un moyen très simple de le faire. Si vous avez juste besoin d'un nombre de mots et non de mots réels, utilisez simplement Apache WordUtils

import org.Apache.commons.lang.WordUtils;

public class CountWord {

public static void main(String[] args) {    
String str = "Just keep a boolean flag around that lets you know if the previous character was whitespace or not pseudocode follows";

    String initials = WordUtils.initials(str);

    System.out.println(initials);
    //so number of words in your file will be
    System.out.println(initials.length());    
  }
}
import Java.io.BufferedReader;
import Java.io.FileReader;

public class CountWords {

    public static void main (String args[]) throws Exception {

       System.out.println ("Counting Words");       
       FileReader fr = new FileReader ("c:\\Customer1.txt");        
       BufferedReader br = new BufferedReader (fr);     
       String line = br.readLin ();
       int count = 0;
       while (line != null) {
          String []parts = line.split(" ");
          for( String w : parts)
          {
            count++;        
          }
          line = br.readLine();
       }         
       System.out.println(count);
    }
}
3

Gardez juste un drapeau booléen qui vous permet de savoir si le caractère précédent était un espace ou non (le pseudocode suit):

boolean prevWhitespace = false;
int wordCount = 0;
while (char ch = getNextChar(input)) {
  if (isWhitespace(ch)) {
    if (!prevWhitespace) {
      prevWhitespace = true;
      wordCount++;
    }
  } else {
    prevWhitespace = false;
  }
}
3
levik

Je pense qu'une approche correcte serait au moyen de Regex:

String fileContent = <text from file>;    
String[] words = Pattern.compile("\\s+").split(fileContent);
System.out.println("File has " + words.length + " words");

J'espère que ça aide. La signification "\ s +" est dans Motif javadoc

2
Oso

Solution de piratage

Vous pouvez lire le fichier texte dans une chaîne var. Puis divisez la chaîne en un tableau en utilisant un seul espace blanc comme délimiteur StringVar.Split (""). 

Le nombre de tableaux correspondra au nombre de "mots" dans le fichier. Bien sûr, cela ne vous donnerait pas le nombre de numéros de ligne. 

2
Gthompson83

3 étapes: Consommez tous les espaces, vérifiez s’il s’agit d’une ligne, consommez tous les espaces non blancs.3

while(true){
    c = inFile.read();                
    // consume whitespaces
    while(isspace(c)){ inFile.read() }
    if (c == '\n'){ numberLines++; continue; }
    while (!isspace(c)){
         numberChars++;
         c = inFile.read();
    }
    numberWords++;
}
0
fabrizioM

Ceci peut être fait de manière très précise en utilisant Java 8:

Files.lines(Paths.get(file))
    .flatMap(str->Stream.of(str.split("[ ,.!?\r\n]")))
    .filter(s->s.length()>0).count();
0
Alex Mamo
BufferedReader bf= new BufferedReader(new FileReader("G://Sample.txt"));
        String line=bf.readLine();
        while(line!=null)
        {
            String[] words=line.split(" ");
            System.out.println("this line contains " +words.length+ " words");
            line=bf.readLine();
        }
0
Niteesh Gupta

Regardez ma solution ici, ça devrait marcher. L'idée est de supprimer tous les symboles indésirables des mots, puis de séparer ces mots et de les stocker dans une autre variable, j'utilisais ArrayList. En ajustant la variable "excludedSymbols", vous pouvez ajouter plus de symboles que vous souhaitez exclure des mots. 

public static void countWords () {
    String textFileLocation ="c:\\yourFileLocation";
    String readWords ="";
    ArrayList<String> extractOnlyWordsFromTextFile = new ArrayList<>();
    // excludedSymbols can be extended to whatever you want to exclude from the file 
    String[] excludedSymbols = {" ", "," , "." , "/" , ":" , ";" , "<" , ">", "\n"};
    String readByteCharByChar = "";
    boolean testIfWord = false;


    try {
        InputStream inputStream = new FileInputStream(textFileLocation);
        byte byte1 = (byte) inputStream.read();
        while (byte1 != -1) {

            readByteCharByChar +=String.valueOf((char)byte1);
            for(int i=0;i<excludedSymbols.length;i++) {
            if(readByteCharByChar.equals(excludedSymbols[i])) {
                if(!readWords.equals("")) {
                extractOnlyWordsFromTextFile.add(readWords);
                }
                readWords ="";
                testIfWord = true;
                break;
            }
            }
            if(!testIfWord) {
                readWords+=(char)byte1;
            }
            readByteCharByChar = "";
            testIfWord = false;
            byte1 = (byte)inputStream.read();
            if(byte1 == -1 && !readWords.equals("")) {
                extractOnlyWordsFromTextFile.add(readWords);
            }
        }
        inputStream.close();
        System.out.println(extractOnlyWordsFromTextFile);
        System.out.println("The number of words in the choosen text file are: " + extractOnlyWordsFromTextFile.size());
    } catch (IOException ioException) {

        ioException.printStackTrace();
    }
}
0
F.A. Botic

Le code ci-dessous supporte Java 8

// Lire le fichier en chaîne

String fileContent=new String(Files.readAlBytes(Paths.get("MyFile.txt")),StandardCharacters.UFT_8);

// Conserver ces éléments dans une liste de chaînes en les scindant avec un délimiteur

List<String> words = Arrays.asList(contents.split("\\PL+"));

int count=0;
for(String x: words){
 if(x.length()>1) count++;
}

sop(x);
0
Sandra Pavan

Fichier Word-Count

Si entre des mots ayant des symboles, vous pouvez séparer et compter le nombre de mots.

Scanner sc = new Scanner(new FileInputStream(new File("Input.txt")));
        int count = 0;
        while (sc.hasNext()) {

            String[] s = sc.next().split("d*[.@:=#-]"); 

            for (int i = 0; i < s.length; i++) {
                if (!s[i].isEmpty()){
                    System.out.println(s[i]);
                    count++;
                }   
            }           
        }
        System.out.println("Word-Count : "+count);
0
Yash