2013-04-24 91 views
1

假设我有一个具有类似格式的大文本文件:读取大文件和处理逐节

节开始... ... ...第一节结束节开始...。 ...... 第一节结束....

我想分析该文件,并使用它一段一段,但我不想保留在内存中的全部内容,我想读一个部分,并对该部分进行一些操作,例如将其插入到数据库中,然后丢弃它并继续阅读下一节,我应该如何以功能方式执行此操作?我只能通过操作可变变量来实现一些实现。

回答

2

你总是可以通过写一个(尾)递归函数*

def parseLines(
    in: Iterator[String], 
    thisSection: List[String] = Nil, 
    results: List[Foo] = Nil 
): List[Foo] = { 
    if (!in.hasNext) results.reverse 
    else in.next match { 
    case "SECTION END" => 
     val section = thisSection.reverse.drop(1) 
     // Do something with data 
     val foo = // whatever you need to store from this section 
     parseLines(in, Nil, foo :: results) 
    case s => 
     parseLines(in, s :: thisSection, results) 
    } 
} 

解决这些各种各样的问题,但它并不总是更好地做到这一点,而不是使用可变的变量。关键是要保持良好的可变性,以便改变状态不会泄露,并且使程序其余部分的逻辑复杂化。在这样的方法中添加一个累加器变量,而不是使其递归,这也非常合适。挑选哪一个使得逻辑更清晰。

* 最好是尾递归或堆栈溢出。使用@tailrec注释来确保。