2017-04-23 115 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

不是真的......你大概可以做一些大膽而短小的事情,但是當你回到這裏並且必須弄清楚它做什麼時,你會很高興;-) –