2010-11-04 12 views
7

J'ai un problème pour compter le nombre de mots dans un fichier. L'approche que je prends est quand je vois un espace ou une nouvelle ligne puis je sais compter un mot.Comptage du nombre de mots dans un fichier

Le problème est que si j'ai plusieurs lignes entre les paragraphes, j'ai fini par les compter comme des mots aussi. 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 sur la façon de résoudre ce problème?

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

word word word 
word word 

word word word 
+1

Un nombre intimidante de doublons: http://stackoverflow.com/search?q=java+word+ compter –

+0

http://stackoverflow.com/questions/277143/whats-the-best-way-to-determine-the-total-number-of-words-of-a-file-in-java –

+0

duplication possible de [ Programme de compte de mots de Java] (http://stackoverflow.com/questions/8102754/java-word-count-program) –

Répondre

9

Je changerais votre approche un peu. Tout d'abord, je voudrais utiliser un BufferedReader pour lire le fichier fichier ligne par ligne en utilisant readLine(). Ensuite, divisez chaque ligne par des espaces blancs en utilisant String.split("\\s") et utilisez la taille du tableau résultant pour voir combien de mots sont 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 si vous voulez compter les espaces comme des caractères).

3

Il suffit de garder un drapeau booléen autour qui vous permet de savoir si le caractère précédent était des espaces ou non (suite pseudocode):

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

solution Hack

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

Le nombre de tableaux correspondrait au nombre de "mots" dans le fichier. Bien sûr, cela ne vous donnerait pas le nombre de lignes.

11

Vous pouvez utiliser un scanner avec un 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); 
} 
+3

Le code ci-dessus donne le mauvais nombre de mots car il compte tous les styles, les ajustements, etc ... il suffit de modifier le code à l'intérieur tout en boucle avec ce 'String word = sc.next(); if (word.indexOf ("\\") == - 1) count ++; 'Cela donnera un nombre un peu plus précis .... –

+0

@SangeetMenon que voulez-vous dire? Je ne comprends pas ce qu'on entend par ça compte tous les styles et les ajustements. Pouvez-vous donner un exemple? – northerner

0

3 étapes: anéantira tous les espaces blancs, vérifier si une ligne est, consommer tous les nonwhitespace.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++; 
} 
3

Ceci est juste une pensée. Il y a un moyen très simple de le faire. Si vous avez juste besoin de nombre de mots et non des mots réels alors il suffit d'utiliser 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());  
    } 
} 
+0

+1 pour faire référence à WordUtils – keuleJ

2

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"); 

Hope it helps. Les « \ s + » Le sens est dans Pattern javadoc

3
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); 
    } 
} 
+0

N'oubliez pas de fermer Reader! – tanyehzheng

0

fichier Word Count

Si entre les mots ayant des symboles, vous pouvez diviser 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*[[email protected]:=#-]"); 

      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

Jetez un oeil à ma solution ici, cela devrait fonctionner.L'idée est d'enlever 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

Cela peut être fait d'une manière très en Java 8:

Files.lines(Paths.get(file)) 
    .flatMap(str->Stream.of(str.split("[ ,.!?\r\n]"))) 
    .filter(s->s.length()>0).count(); 
0
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(); 
     }