Groovy читает текстовый файл, но опускает заголовок

Это продолжение вопроса, заданного здесь: Текстовый файл синтаксического анализа Groovy

Разница теперь в том, что у моего файла есть заголовок, я попытался сначала прочитать заголовок, а затем содержимое, которое мне нужно, но по какой-то причине он не работает.

def dataList = []
def theInfoName = 'testdata.txt'
boolean headersDone = false    //header set to false by default

File theInfoFile = new File( theInfoName )

if( !theInfoFile.exists() ) {
  println "File does not exist"
} else {
  def driveInfo = [:]
  // Step through each line in the file
  theInfoFile.eachLine { line ->

  //this is where im trying to account for the header
  if(!headersDone) {      //look if line contains "..." if it does that turn headersDone to true
   if(line.contains("...")) {
     headersDone = true
   }
  } else {
     // If the line isn't blank
     if( line.trim() ) {
       // Split into a key and value
       def (key,value) = line.split( '\t: ' ).collect { it.trim() }
       // and store them in the driveInfo Map
       driveInfo."$key" = value
     }
     else {
       // If the line is blank, and we have some info
       if( driveInfo ) {
         // store it in the list
         dataList << driveInfo
         // and clear it
        driveInfo = [:]
       }
     }
  }
  // when we've finished the file, store any remaining data
  if( driveInfo ) {
    dataList << driveInfo
  }
}

dataList.eachWithIndex { it, index ->
  println "Drive $index"
  it.each { k, v ->
    println "\t$k = $v"
  }
}

Я попробовал это с помощью кода, приведенного в предыдущем посте, чтобы убедиться, что это не то, что я делаю по-другому, и он дал тот же результат.

Случается, что один и тот же блок информации публикуется 11 раз.

Заголовок выглядит следующим образом:

Random date information here with some other info
Slightly more random information followed by

Examining hard disk information ...

HDD Device 0 : /dev/sda
HDD Model ID  : ST3160815A
HDD Serial No : 5RA020QY
HDD Revision  : 3.AAA
HDD Size     : 152628 MB
Interface    : IDE/ATA
Temperature         : 33 C
Health  : 100%
Performance  : 70%
Power on Time : 27 days, 13 hours
Est. Lifetime : more than 1000 days

HDD Device 1 : /dev/sdb
HDD Model ID  : TOSHIBA MK1237GSX
HDD Serial No : 97LVF9MHS
HDD Revision  : DL130M
HDD Size     : 114473 MB
Interface    : S-ATA
Temperature  : 30 C
Health  : 100%
Performance  : 100%
Power on Time : 38 days, 11 hours
Est. Lifetime : more than 1000 days

Кто-нибудь знает, почему он распечатывает дубликат информации?


person JohnStamos    schedule 11.08.2010    source источник
comment
Заголовок всегда заканчивается на ...?   -  person tim_yates    schedule 11.08.2010
comment
заголовок заканчивается: Изучение информации о жестком диске ... Сначала я подумал, что, возможно, мне также нужно было включить \ n \ n после него, но это вообще не возвращает никаких данных.   -  person JohnStamos    schedule 11.08.2010
comment
И ваш код работает на меня ... Вы уверены, что это тот код, который вы запускаете? Проблема только в том, что вам не хватает } перед финальным if( driveInfo )   -  person tim_yates    schedule 11.08.2010
comment
Я думал, что забыл закрывающую скобку в своем сообщении, что действительно так и было. Тем не менее, я не пропустил его в своем коде, мне следовало написать c + p'ed вместо того, чтобы вводить его. Код выше работает для вас? (после добавления закрывающей скобки). Мне не повезло с этим, мне это кажется правильным, поэтому я решил опубликовать его, чтобы узнать, знает ли кто-нибудь еще о причине, по которой он не работает должным образом.   -  person JohnStamos    schedule 11.08.2010
comment
Да, используя предоставленные тестовые данные с добавленным отсутствующим }, он распечатывает Drive 0 и Drive 1, как это было в другом вопросе, без повторяющихся данных: - /   -  person tim_yates    schedule 11.08.2010
comment
Я снова набрал код, и теперь он работает. Я не знаю точно, в чем была проблема, но у меня такое ощущение, что вы и Кристоф Метцендорф упомянули именно об этом. Скобка должна была оставить в цикле хранящую часть скрипта. -Спасибо за потраченное время, Тим, вы очень любезны, что помогли   -  person JohnStamos    schedule 13.08.2010


Ответы (2)


Проблема заключается в добавлении "последнего" driveInfo к dataList:

// when we've finished the file, store any remaining data
if( driveInfo ) {
   dataList << driveInfo
}

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

person Christoph Metzendorf    schedule 11.08.2010
comment
Я не совсем определил причину проблемы, но почти уверен, что проблема именно в этом. Спасибо за ответ Крис. - person JohnStamos; 13.08.2010

Не вижу ничего явно неправильного в коде. Я предлагаю добавить пару println, чтобы вы могли видеть, как меняются карты, списки и переменные. Это может дать вам представление о том, где может быть ошибка.

person Aaron Digulla    schedule 11.08.2010
comment
Первое, что я сделал, это установил println, чтобы увидеть, изменится ли мой логический заголовок headersDone, что происходит. Придется проверять карты и списки утром. Я ухожу на ночь, проверю ответы и отправлю ответ с дополнительной информацией, как только проверю, как меняются карты и списки. Я думаю, что это вовсе не пропуск заголовка. - person JohnStamos; 11.08.2010
comment
Спасибо за ваше время, Аарон, просматривая мой код построчно (вводя его заново), в итоге проблема была устранена. Оглядываясь назад, можно сказать, что почти наверняка проблема заключается в том, что что-то осталось внутри цикла. (следовательно, повторяющиеся данные) - person JohnStamos; 13.08.2010