Разбор текстового файла в Java - PullRequest
1 голос
/ 13 сентября 2010

Пример из входного файла:

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, Title & Lyrics должны быть извлечены в соответствующие строки с использованием captalization и форматирования без изменений.Этот код для поля 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 ().Очевидно, я что-то здесь упускаю.

Итак, я близок к правильному пути или я в совершенно другом городе?

Ответы [ 3 ]

3 голосов
/ 13 сентября 2010

Из вашего кода

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 (я предполагаю) readToken сохраняется как следующая строка. Если readToken содержит «ARTIST», то строка NEXT вниз сохраняется как строка исполнителя. Аналогично для содержания "TITLE". К тому времени, когда цикл while повторяется, вы, возможно, уже нажали LYRICS, полностью пропустив TITLE, и он стал равным NULL.

Возможно, вы хотите сэкономить

artist = readToken; или title = readToken; вместо этого.

Также не забудьте указать подстроку исполнителя и название, если вы не хотите печатать "ARTIST =" ARTISTNAMEHERER "TITLE =" TITLENAMEHERE "" и скорее "ARTISTNAME, TITLENAME"

2 голосов
/ 13 сентября 2010

В дополнение к ответу Алекса Харта, я думаю, вы могли бы рассмотреть возможность использования классов 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...
  }
}
1 голос
/ 13 сентября 2010

Похоже, что то, что вы здесь делаете, читает построчно, но когда вы найдете то, что ищете, вы устанавливаете свою переменную на следующую строку. Это может вызывать проблемы и проблемы за пределами границ, и вполне может быть признаком вашей неудачи

...