2010-09-13 73 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’