簡體   English   中英

Java-計算文件中的單詞,行和字符

[英]Java - Counting words, lines, and characters from a file

我正在嘗試從文件中讀取單詞。 我需要計算文本文件中的單詞,行和字符。 字數統計應僅包括字(僅包含字母,標點,空格或非字母字符)。 字符數應僅包括這些單詞內的字符。

到目前為止,這就是我所擁有的。 我不確定如何計算字符。 每次我運行該程序時,只要輸入文件名,它就會跳到catch機制(並且文件路徑應該沒有問題,就像我之前嘗試過的那樣)。 我嘗試在沒有try / catch的情況下創建程序,以查看錯誤是什么,但是如果沒有它,它將無法正常工作。

輸入文件名時為什么跳到catch功能? 如何修復此程序以正確計算文本文件中的單詞,行和字符?

如果輸入正確的文件名,我的代碼不會有任何異常。 至於讀取字符數,您應該稍微修改一下邏輯。 您應該創建一個StringTokenizer st = new StringTokenizer(tempo, "[ .,:;()?!]+");的新實例StringTokenizer st = new StringTokenizer(tempo, "[ .,:;()?!]+");而不是直接串聯單詞數量的計數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()識別單詞和字符

我嘗試了您的代碼,但這里沒有收到任何異常。 但是,我懷疑當您輸入文件名時,也許您忘記了文件的擴展名。

您可能在輸入時忘記了文件擴展名,但是有一種更簡單的方法。 您還提到您不知道如何計算字符。 您可以嘗試如下操作:

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)有點多余。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM