Подсчет количества слов в файле
У меня возникла проблема с подсчетом количества слов в файле. Подход, который я использую, - это когда я вижу пробел или новую строку, тогда я знаю, что считаю слово.
проблема в том, что если у меня есть несколько строк между абзацами, то я в конечном итоге считая их как слова. Если вы посмотрите на метод 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);