2010-11-04 23 views
7

Tengo un problema al contar la cantidad de palabras en un archivo. El enfoque que estoy tomando es cuando veo un espacio o una línea nueva, entonces sé contar una palabra.Contando el número de palabras en un archivo

El problema es que si tengo varias líneas entre párrafos, entonces terminé contándolos también como palabras. Si miras el método readFile(), puedes ver lo que estoy haciendo.

¿Podría ayudarme y orientarme en la dirección correcta sobre cómo solucionar esto?

archivo Ejemplo de entrada (incluyendo una línea en blanco):

word word word 
word word 

word word word 
+1

Un número intimidante de duplicados: http://stackoverflow.com/search?q=java+word+ contar –

+0

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

+0

posible duplicado de [ programa de recuento de palabras de Java] (http://stackoverflow.com/questions/8102754/java-word-count-program) –

Respuesta

9

Cambiaría su enfoque un poco. Primero, usaría un BufferedReader para leer el archivo en línea por línea usando readLine(). Luego divida cada línea en espacios en blanco usando String.split("\\s") y use el tamaño de la matriz resultante para ver cuántas palabras hay en esa línea. Para obtener el número de caracteres, puede ver el tamaño de cada línea o de cada palabra dividida (dependiendo de si desea contar espacios en blanco como caracteres).

3

Hemos de tener una bandera booleana alrededor que le permite saber si el carácter anterior era un espacio en blanco o no (pseudocódigo siguiente):

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

solución Hack

Usted puede leer el archivo de texto en una cadena var. Luego divide el String en una matriz usando un espacio en blanco único como el delimitador StringVar.Split ("").

El recuento de matriz equivaldría a la cantidad de "Palabras" en el archivo. Por supuesto, esto no le daría un recuento de los números de línea.

11

Puede utilizar un escáner con un FileInputStream en lugar de un BufferedReader con un FileReader. Por ejemplo: -

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

El código anterior muestra el recuento incorrecto de palabras ya que cuenta todos los estilos, los ajustes etc ..... basta con modificar el código en el interior, mientras repetir con este 'String word = sc.next(); si (word.indexOf ("\\") == - 1) recuento ++; 'Esto le dará un poco más de la cuenta precisa .... –

+0

@SangeetMenon ¿qué quiere decir? No entiendo lo que significa, cuenta todos los estilos y ajustes. ¿Puede dar un ejemplo? – northerner

0

3 pasos: Consumir todos los espacios en blanco, comprobar si es una línea, consumir todo el 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

Ésta es sólo una idea. Hay una manera muy fácil de hacerlo. Si sólo necesita número de palabras y las palabras no reales a continuación, sólo tiene que utilizar 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 para referirse a WordUtils – keuleJ

2

Creo que un enfoque correcto sería por medio de expresiones regulares:

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

espero que ayude. Los "\ s +", es decir está en 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

Recuerde cerrar Reader! – tanyehzheng

0

archivo de Word-Count

Si entre palabras que tienen algunos símbolos entonces se puede dividir y contar el número de palabras.

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

Tome un vistazo a mi solución a este problema, que debería funcionar.La idea es eliminar todos los símbolos no deseados de las palabras, luego separar esas palabras y almacenarlas en alguna otra variable, yo estaba usando ArrayList. Al ajustar la variable "excludedSymbols" puede agregar más símbolos que le gustaría que se excluyan de las palabras.

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

Esto se puede hacer de una manera muy manera el uso de 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(); 
     } 
Cuestiones relacionadas