Подсчет количества слов в файле

У меня возникла проблема с подсчетом количества слов в файле. Подход, который я использую, - это когда я вижу пробел или новую строку, тогда я знаю, что считаю слово.

проблема в том, что если у меня есть несколько строк между абзацами, то я в конечном итоге считая их как слова. Если вы посмотрите на метод readFile (), вы увидите, что я делаю.

не могли бы вы помочь мне и направить меня в правильном направлении, как это исправить?

пример входного файла (включая пустую строку):

word word word
word word

word word word

13 ответов


Я бы немного изменил ваш подход. Во-первых, я бы использовал BufferedReader читать файл в файл построчно с помощью readLine(). Затем разделите каждую строку на пробелы, используя String.split("\s") и использовать размер результирующего массива, чтобы увидеть, сколько слов в этой строке. Чтобы получить количество символов, вы можете посмотреть размер каждой строки или каждого разделенного слова (в зависимости от того, хотите ли вы считать пробелы символами).


вы можете использовать сканер с FileInputStream вместо BufferedReader с FileReader. Например:-

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

Это просто мысль. Есть один очень простой способ сделать это. Если вам просто нужно количество слов, а не фактические слова, то просто используйте 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());    
  }
}

просто держите логический флаг вокруг, который позволяет вам знать, был ли предыдущий символ пробелом или нет (псевдокод следует):

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

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

взломать решением

вы можете прочитать текстовый файл в строку var. Затем разделите строку на массив, используя один пробел в качестве разделителя StringVar.Расщеплять.)" "(

количество массивов будет равно количеству "слов" в файле. Конечно, это не даст вам количество номеров строк.


Я думаю, что правильный подход будет с помощью Regex:

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

надеюсь, что это помогает. Значение "\s+ " находится в шаблон javadoc


3 шага: потреблять все пробелы, проверьте, если строка, потреблять все 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++;
}

Файл Word-Count

если между словами, имеющими некоторые символы, то вы можете разделить и подсчитать количество слов.

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

взгляните на мое решение здесь, он должен работать. Идея состоит в том, чтобы удалить все нежелательные символы из слов, затем отделить эти слова и сохранить их в какой-то другой переменной, я использовал ArrayList. Регулируя переменную" excludedSymbols", вы можете добавить больше символов, которые вы хотели бы исключить из слов.

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();
    }
}

Это можно сделать очень способом, используя Java 8:

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

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();
        }

приведенный ниже код поддерживает в Java 8

//читаем файл в строку

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

/ / сохранение их в список строк путем разделения с помощью разделителя

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

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

sop(x);