用Java解析文本文件

用Java解析文本文件,java,file-io,text-parsing,Java,File Io,Text Parsing,输入文件中的示例: 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="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
"
艺术家、标题和歌词字段必须提取到各自的字符串中,并保持大写和格式不变。此代码用于艺术家字段

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);
}
最后打印出来:

从代码中,我看不出为什么输出是这样打印的。每次通过循环时,readToken字符串都会被刷新,然后应该通过contains方法进行比较。很明显,我遗漏了一些东西


那么,我是接近正确的轨道还是在一个完全不同的城市?

看起来你在这里做的是逐行阅读,但当你找到你要找的东西时,你正在将变量设置到下一行。这可能会导致问题和越界问题,并且很可能是您的灾难的症状

看起来您在这里所做的是逐行读取,但当您找到要查找的内容时,您正在将变量设置为下一行。这可能会导致问题和越界问题,并且很可能是你的失误的一个征兆

< p> Alex Hart的回答,我认为你可以考虑使用java的模式和Matter类,并使用组来获得匹配的参数,例如未测试的:

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...
  }
}

进一步Alex Hart的回答,我认为您可以考虑使用java的模式和Matter类,并使用组来获得匹配的参数,例如未测试的:

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...
  }
}
从你的密码

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条件中是否存在现有的下一行,如果为真,则字符串im假定readToken保存为下一行。如果readToken包含艺术家,则下一行保存为艺术家字符串。同样,用于包含标题。当while循环返回时,您可能已经点击了歌词,完全跳过了标题,导致其为空

你想要的也许是储蓄

艺术家=readToken; 或title=readToken;相反

另外,如果您不想从您的代码中打印artist=ARTISTNAME herer title=TITLENAME,而不是ARTISTNAME,TITLENAME,请不要忘记将Artister和title分为子字符串

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条件中是否存在现有的下一行,如果为真,则字符串im假定readToken保存为下一行。如果readToken包含艺术家,则下一行保存为艺术家字符串。同样,用于包含标题。当while循环返回时,您可能已经点击了歌词,完全跳过了标题,导致其为空

你想要的也许是储蓄

艺术家=readToken; 或title=readToken;相反


另外,如果您不想打印artist=ARTISTNAMEHERER title=TITLENAME,而不是ARTISTNAME,TITLENAME,请不要忘记将artist和title分为子字符串。令牌的分隔符是什么?您的代码无法编译。你粘贴代码了吗?或者你只是试着在上面键入一些代码?读取的是什么类型的对象?此外,readToken.containsTITLE中的关闭参数而不是打开参数不正确。该代码看起来无法编译。该代码是try-catch块中的一个片段。readIn是一个扫描仪对象。我想使用双引号作为分隔符,但不知道如何使用它们。所以我使用了等号。标记的分隔符是什么?代码无法编译。你粘贴代码了吗?或者你只是试着在上面键入一些代码?读取的是什么类型的对象?此外,readToken.containsTITLE中的关闭参数而不是打开参数不正确。该代码看起来无法编译。该代码是try-catch块中的一个片段。readIn是一个扫描仪对象。我想使用双引号作为分隔符,但不知道如何使用它们。所以我用了等号。尽管我没有用你的建议,我还是选择了你的回答作为答案,因为它确实让我走上了正确的道路。谢谢谢谢解析的另一个解决方案当然是使用ANTLR。有一个学习曲线,但它的价值取决于您的解析需求。虽然我没有采纳你的建议,但我还是选择了你的回答作为答案,因为它确实让我走上了正确的道路。谢谢谢谢解析的另一个解决方案当然是使用ANTLR。有一个学习曲线,但它的价值取决于您的解析需求。它的lexer也可以很好地为您服务。