[英]Parsing a text file in Java
輸入文件中的示例:
ARTIST="unknown"
TITLE="Rockabye Baby"
LYRICS="Rockabye baby in the treetops
When the wind blows your cradle will rock
When the bow breaks your cradle will fall
Down will come baby cradle and all
"
必須將“藝術家”,“標題和歌詞”字段提取到它們各自的字符串,且大小寫不變且格式不變。 此代碼用於Artist字段
while (readIn.hasNext()) {
readToken= readIn.next();
if (readToken.contains("ARTIST")) {
artist= readIn.next();
}
if (readToken.contains("TITLE")){
title= readIn.next();
System.out.print(artist+" "+title);
}
最終將其打印出來:
"unknown"
TITLE null"unknown"
TITLE null"unknown"
TITLE
從代碼中,我看不到為什么輸出以這種方式打印。 對於每次循環,都會刷新readToken字符串,然后應通過contains()方法對其進行比較。 顯然我在這里錯過了一些東西。
那么,我是在正確的道路上走還是在完全不同的城市中?
從你的代碼
while (readIn.hasNext()) {
readToken= readIn.next();
if (readToken.contains("ARTIST")) {
artist= readIn.next();
}
if (readToken.contains("TITLE")){
title= readIn.next();
System.out.print(artist+" "+title);
}
如果假設已正確聲明並實例化了該程序(變量artist,readToken和title),則該程序首先檢查while條件中是否存在下一行,如果為true,則將String(假設輸入)readToken保存為下一行。 如果readToken包含“ ARTIST”,則將下一行向下保存為藝術家字符串。 同樣包含“ TITLE”。 到while循環重復時,您可能已經打了LYRICS,完全跳過了TITLE,導致它為NULL。
您想要的就是節省
artist = readToken; 或標題= readToken; 代替。
如果您不想打印“ ARTIST =“ ARTISTNAMEHERER” TITLE =“ TITLENAMEHERE”“而不是” ARTISTNAME,TITLENAME“,也不要忘記為藝術家和標題添加字符串
除了Alex Hart的答案,我認為您可以考慮使用Java的Pattern和Matcher類,並使用組來獲取匹配的參數,例如(未測試):
private static final Pattern RECORDING_HEADER =
new Pattern("(ARTIST=\\"(.*)\\")?(TITLE=\\"(.*)\\")?(LYRICS=\\"(.*)\\")?");
然后,當您閱讀一行時:
String line = readIn.readLine(); // Presuming that readIn is a BufferedReader
Matcher m = RECORDING_HEADER.matcher(line);
if (m.matches()) {
final int artistGroup = 2;
String artist = m.group(artistGroup);
final int titleGroup = 4;
String title = m.group(titleGroup);
final int lyricsGroup = 6;
String lyrics = m.group(lyricsGroup);
if (artist != null) {
// You've got an artist...
} else if (title != null) {
// etc...
}
}
似乎您在這里所做的工作正在逐行讀取,但是當您找到所需的內容時,便會將變量設置為下一行。 這可能會導致問題出界,也很可能是您不幸事故的征兆
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.