2017-04-23 84 views
0

我已经txt文件,例如:分割文件到列表

useless text 
-- modelName 
model parameters 
model parameters 

-- modelName 
model parameters 
model parameters 

e.t.c 

我需要这个文件分割成列表,其中列表中的元素是与模型parametrs模型。 我给这家

File(FILEPATH).eachLine { line -> 
      if (line =regExpForModelName) { 
       while(line!=regExpForModelName) 
       model.add(line) 
      } 
     } 

while(line!=regExpForModelName) algoritm显然是错误的

+0

你试过了什么吗?你有什么问题? –

+0

哦,忘了把我的代码。我停留在阅读模型参数。 我idieas是 '文件(FILEPATH).eachLine {线 - (!line.next()= regExpForModelName)> 如果(线= regExpForModelName){ 而 Model.add(线) } }' 但ofc code“while(line.next()!= regExpForModelName)”不起作用 – Dariys

回答

0

你可以用一个简单的状态机做它像这样:

enum State { 
    SCANNING, PARSING 
} 

def parseFile(String filename) { 
    def key = null 
    def result = [] 
    def mode = State.SCANNING 
    new File(filename).eachLine { line -> 
     switch(mode) { 
      case State.SCANNING: 
       if(line.startsWith('--')) { 
        key = (line - '--').trim() 
        result << [name:key, lines:[]] 
        mode = State.PARSING 
       } 
       break 
      case State.PARSING: 
       if(line.size() == 0) { 
        mode = State.SCANNING 
       } 
       else { 
        result[-1].lines << line 
       } 
     } 
     result 
    } 
} 

def results = parseFile('/tmp/file.txt') 

results.each { 
    println it 
} 

所以它开始扫描,然后当它发现一个标题项,它将一个新的元素添加到列表中,并切换到PARSING

然后它保持PARSING(并将行添加到列表),直到它碰到空行,当它切换回扫描状态时

+0

哦,谢谢。 我以为mb groovy对这个解析有一些神奇的举动。 – Dariys

+0

不是真的......你大概可以做一些大胆而短小的事情,但是当你回到这里并且必须弄清楚它做什么时,你会很高兴;-) –