2010-09-13 72 views
1

實施例:解析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 
" 

藝術家,標題&歌詞字段必須被提取到與captalization和格式不變它們各自的字符串。這對於藝術家字段

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()方法進行比較。很明顯,我在這裏錯過了一些東西。

那麼,我接近正確的軌道還是我在一個完全不同的城市?

+0

什麼是你的分隔符的打印令牌? – schwiz 2010-09-13 02:20:41

+2

你的代碼不會編譯。你*在你的代碼中粘貼了*嗎?或者你是否試圖在SO上鍵入一些代碼? – 2010-09-13 02:20:43

+1

readIn是什麼類型的對象?此外,您在readToken.contains)「TITLE」中有一個不正確的關閉paren而不是開放paren。 – atk 2010-09-13 02:21:44

回答

2

除了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... 
    } 
} 
+0

即使我沒有使用你的建議,我仍然選擇你的回答作爲答案,因爲它確實讓我在正確的軌道上下了臺。謝謝! – Jason 2010-10-14 10:44:04

+0

謝謝。解析的另一個解決方案當然是使用ANTLR。有一個學習曲線,但值得你取決於你的解析要求。它的詞法分析器也可以很好地爲你服務。 – 2010-10-14 22:55:21

1

它看起來好像你在做什麼是逐行閱讀,但是當你找到你正在尋找的東西時,你正在將你的變量設置到下一行。這可能會導致問題和越界問題,很可能是你的事故的症狀

3

從你的

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條件中是否存在下一行,如果是,則String(im假設)readToken保存爲下一行。如果readToken包含「ARTIST」,則將NEXT下一行保存爲藝術家字符串。同樣包含「TITLE」。到while循環重複時,您可能已經擊中了LYRICS,完全跳過了TITLE,導致它成爲NULL。

你想要的可能是保存

artist = readToken; 或title = readToken;代替。

而且不要忘了串藝術家和標題,如果你不想要的「藝術家=」 ARTISTNAMEHERER「TITLE =‘TITLENAMEHERE’,」和而‘ARTISTNAME,TITLENAME’