Java - подсчет слов, строк и символов из файла - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь прочитать слова из файла.Мне нужно посчитать слова, строки и символы в текстовом файле.Количество слов должно включать только слова (содержащие только буквы алфавита, без знаков препинания, пробелов или неалфавитных символов).Количество символов должно включать только символы внутри этих слов.

Это то, что я до сих пор.Я не уверен, как считать персонажей.Каждый раз, когда я запускаю программу, она переходит к механизму перехвата, как только я ввожу имя файла (и у него не должно быть проблем с путем к файлу, как я пытался использовать его раньше).Я пытался создать программу без try / catch, чтобы увидеть, что это за ошибка, но она не сработает без нее.

Почему при переходе к имени файла происходит переход к функции catch?Как я могу исправить эту программу для правильного подсчета слов, строк и символов в текстовом файле?

Ответы [ 3 ]

1 голос
/ 14 марта 2019

Я не получу никаких исключений с вашим кодом, если я дам правильное имя файла.Что касается чтения количества символов, вам следует немного изменить логику.Вместо того, чтобы напрямую объединять количество слов, вы должны создать новый экземпляр StringTokenizer st = new StringTokenizer(tempo, "[ .,:;()?!]+");, выполнить итерацию по всем токенам и суммировать длину каждого токена.Это должно дать вам количество символов.Что-то вроде ниже

while (fileScan.hasNextLine()) {
            lineC++;
            tempo = fileScan.nextLine();
            StringTokenizer st = new StringTokenizer(tempo, "[ .,:;()?!]+");
            wordC += st.countTokens();
            while(st.hasMoreTokens()) {
                String stt = st.nextToken();
                System.out.println(stt); // Displaying string to confirm that like is splitted as I expect it to be
                charC += stt.length();
            }
            System.out.println("Lines: " + lineC + "\nWords: " + wordC+" \nChars: "+charC);
        }

Примечание: Экранирующий символ с StringTokenizer не будет работать.то есть вы ожидаете, что \\s должен быть разделен любым пробельным символом, но вместо этого он будет разделяться на основе буквального символа s.Если вы хотите экранировать символ, я предлагаю вам использовать java.util.Pattern и java.util.Matcher и использовать его matcher.find() для идентификации слов и символов

0 голосов
/ 14 марта 2019

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

0 голосов
/ 14 марта 2019

Возможно, вы забыли расширение файла при вводе, но есть гораздо более простой способ сделать это.Вы также упоминаете, что не знаете, как считать персонажей.Вы можете попробовать что-то вроде этого:

import java.util.Scanner;
import java.util.StringTokenizer;
import java.io.*;
import java.util.stream.*;

public class WordCount
{
    public static void main(String[] args)
    {
        Scanner userInput = new Scanner(System.in);

       try {
            // Input file
            System.out.println("Please enter the name of the file.");
            String content = Files.readString(Path.of("C:/Users/garre/OneDrive/Desktop/" + userInput.next()));
            System.out.printf("Lines: %d\nWords: %d\nCharacters: %d",content.split("\n").length,Stream.of(content.split("[^A-Za-z]")).filter(x -> !x.isEmpty()).count(),content.length());
            }


        catch (IOException ex1) {
            System.out.println("Error.");
            System.exit(0);
        }
    }
}

Проходя по коду

import java.util.stream.*;

Обратите внимание, что мы используем пакет streams для фильтрации пустых строк при поиске слов.Теперь давайте немного перейдем вперед.

String content = Files.readString(Path.of("C:/Users/garre/OneDrive/Desktop/" + userInput.next()));

Приведенная выше часть получает весь текст в файле и сохраняет его в виде строки.

System.out.printf("Lines: %d\nWords: %d\nCharacters: %d",content.split("\n").length,Stream.of(content.split("[^A-Za-z]")).filter(x -> !x.isEmpty()).count(),content.length());

Хорошо, это длинная строка,Давайте разберем его.

"Lines: %d\nWords: %d\nCharacters: %d" - это строка формата, где каждый %d заменяется соответствующим аргументом в функции printf.Первый %d будет заменен на content.split("\n").length, который является количеством строк.Мы получаем количество строк, разбивая строку.

Второй %d заменяется на Stream.of(content.split("[^A-Za-z]")).filter(x -> !x.isEmpty()).count().Stream.of создает поток из массива, а массив представляет собой массив строк после того, как вы разбили все, что не алфавитно (вы сказали, что слова - это все, что не алфавитно).Далее мы отфильтровываем все пустые значения, так как String.split сохраняет пустые значения..count() говорит само за себя, принимает количество слов, оставшихся после фильтрации.

Третий и последний %d является самым простым.Он заменяется длиной строки.content.length() должно быть само за себя.

Я оставил ваш catch блок без изменений, но я чувствую, что System.exit(0) немного избыточен.

...