[英]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.Pattern
和java.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.