[英]Java | Finding specific lines from file
所以我目前正在研究學校的一個項目。 我以這種格式將客戶的數據保存在 .txt 文件中
-----
17-03-2020 15:49
WashType: De Luxe
ID: 1, Name: Janus Pedersen
-----
-----
20-03-2020 13:07
WashType: Standard
ID: 2, Name: Hardy Akira
-----
為了感謝客戶使用此服務,我想在每購買 10 次后給客戶一些電影票。 為此,我想再次閱讀此文件並查找他們的 ID 並進行計數,但我根本無法完成這項工作。 我最初的想法是這樣的,但它一直給我一個空指針
String[] words;
FileReader fr = new FileReader("stats.txt");
BufferedReader br = new BufferedReader(fr);
String s;
String input = String.valueOf(washCard.getCardID());
int count=0;
while((s=br.readLine())!=null)
{
words=s.split(" ");
for (String word : words)
{
if (word.equals(input))
{
count++;
System.out.println(word);
}
}
}
有人對此有什么好主意嗎? 為了讓事情更容易,我已將其全部添加到 github 存儲庫中: https : //github.com/rasm937k/curly-broccoli
您可以為此使用 Java 8 流:
Files.lines(Paths.get("stats.txt"))
.map(line -> line.split(" "))
.filter(words -> words[5].equals(washCardId))
.count();
這里還有一個關於 Java 8 Streams 的不錯的教程: https : //www.baeldung.com/java-8-streams
以下代碼基於Michał Kaciuba 的回答,但經過調整以適合您的stats.txt
文件的實際格式。 我不知道如何將其作為評論發布,因此我將其發布為答案,但正如我所說,Michał Kaciuba 應該受到贊揚,我認為您應該接受他的回答。 請注意,代碼的解釋遵循實際代碼。
String input = String.valueOf(washCard.getCardID());
Pattern pttrn = Pattern.compile("^ID: (\\d+)");
Path p = Paths.get("stats.txt");
try {
long count = Files.lines(p) //throws java.io.IOException
.filter(l -> {Matcher mtchr = pttrn.matcher(l); return mtchr.find() && input.equals(mtchr.group(1));})
.count();
System.out.println(count);
}
catch (IOException x) {
x.printStackTrace();
}
Files.lines(p)
創建一個流,其中流中的每個元素都是來自文件stats.txt
,即一個String
。
正則表達式匹配以ID:
開頭的行ID:
后跟一個空格,后跟一系列一個或多個數字。 數字部分被稱為捕獲組,因為它被括在括號中。
filter()
檢查文件中的行是否與正則表達式匹配,如果匹配, filter()
然后檢查該行中的“數字”是否與您的input
匹配,即String.valueOf(washCard.getCardID())
。
count()
計算filter()
返回的流中的所有元素, count()
返回long
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.