2011-05-23 48 views
0

我正在尋找最好的方式來處理一個文件,其中,基於內容,我將某些行合併到XML並返回XML。需要迭代一個文件返回批處理文件的最佳方式爲XML

例如鑑於

line 1 
line 2 
line 3 
line 4 
line 5 

我可能要第一次調用返回

<msg>line 1, line 2</msg> 

和後續調用返回

<msg>line 5, line 4</msg> 

跳躍的無趣的內容3號線和排放的輸入流。 (注意:<msg>標籤將始終包含連續的行,但XML中這些行的數量和組織結構會有所不同。)如果您需要一些標準來選擇要包含在消息中的行,則假定奇數行#s與在下面四行中,偶數行#與下面兩行結合,mod(10)行#與以下五行組合,跳過以'#'開頭的行。

我想我應該實現這是一個迭代器,所以我可以做

<root>{ for (m <- messages(inputstream)) yield m }</root> 

是合理嗎?如果是這樣,如何最好地實施它?如果不是,如何最好地實施它? :)

感謝

+1

沒有足夠的信息。用什麼標準來決定這些行的順序是什麼,應該包含哪些內容,而不應該包含哪些內容?我注意到這些線條也是倒置的 - 1,2,然後是5,4.這裏的標準是什麼? – 2011-05-23 20:38:30

+0

@ daniel-c-sobral條件過於複雜,無法包含。我認爲這足以知道文件是從頭開始到結束,並且有多個條件來確定何時合併行,並且多個條件指示組合行作爲節點返回時。比方說,如果#行是偶數,它會與以下四行相結合。如果第#行是奇數,則與第二行相結合。如果該行是一個mod(10),則它與以下五行組合。 – nix 2011-05-23 21:11:55

回答

0

這個答案提供了我的解決方案:How do you return an Iterator in Scala?

我嘗試以下,但似乎有某種緩衝問題和線條調用之間跳過Log.next

class Log(filename:String) { 

    val src = io.Source.fromFile(filename) 
    var node:Node = null 

    def iterator = new Iterator[Node] { 
    def hasNext:Boolean = { 
     for (line <- src.getLines()) { 
     // ... do stuff ... 
     if (null != node) return true 
     } 
     src.close() 
     false 
    } 

    def next = node 
} 

有可能是一個比較斯卡拉-辦法做到這一點,我想看到它,但是這是我的解決方案,以推動現在。