Java-计数文件中的单词,行和字符



我正在尝试从文件中读取单词。我需要计算文本文件中的单词,行和字符。单词计数仅应包括单词(仅包含字母字母,没有标点符号,空格或非字母字符)。角色数量应仅包括这些单词中的字符。

这就是我到目前为止所拥有的。我不确定如何计算角色。每次我运行程序时,一旦我输入文件名,它就会跳到捕获机制(并且它应该对文件路径没有问题,就像我之前尝试过的那样)。我试图在没有尝试/捕获的情况下创建程序以查看错误是什么,但是没有它。

当我输入文件名时,为什么它会跳到捕获功能?如何修复此程序以正确计算文本文件中的单词,行和字符?

如果我给出适当的文件名,我对您的代码没有任何例外。至于阅读字符的数量,您应该稍微修改逻辑。您应该创建一个新的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.Patternjava.util.Matcher并将其使用matcher.find()用于IDENFITY单词和字符

我尝试了您的代码,但是这里没有收到任何例外。但是,我怀疑当您输入文件名时,也许您忘记了文件的扩展名。

您可能在给出输入时忘记了文件扩展名,但是这样做的方法要简单得多。您还提到您不知道如何计算角色。您可以尝试这样的事情:

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: %dnWords: %dnCharacters: %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.*;

注意,我们使用流软件包,在查找单词时过滤空字符串。现在让我们跳过一点。

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

上面的部分将所有文本获取在文件中并将其存储为字符串。

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

好吧,这是一条长线。让我们分解。

"Lines: %dnWords: %dnCharacters: %d"是一种格式字符串,其中每个%dprintf函数中的相应参数替换。第一个%d将被content.split("n").length替换,即行数。我们通过拆分字符串获得线数。

第二个%dStream.of(content.split("[^A-Za-z]")).filter(x -> !x.isEmpty()).count()取代。Stream.of从数组中创建一个流,并且在您对任何非字符质量的任何东西分开后,数组是一系列字符串(您说单词是非字母的任何内容)。接下来,我们过滤所有空值,因为String.split保持空值。.count()是不言自明的,要在过滤后剩下的单词数量。

第三和最后一个%d是最简单的。它被字符串的长度替换。content.length()应该是不言自明的。

我完整地离开了您的catch块,但是我觉得System.exit(0)有点冗余。

相关内容

  • 没有找到相关文章

最新更新