Groovy читать текстовый файл, но опустить заголовок - PullRequest
1 голос
/ 11 августа 2010

Это продолжение вопроса, заданного здесь: 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

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

Ответы [ 2 ]

2 голосов
/ 11 августа 2010

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

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

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

0 голосов
/ 11 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...