簡體   English   中英

用Java解析文本文件

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

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