读取大文件并逐节处理

时间:2013-04-24 15:37:25

标签: scala

假设我有一个大文本文件,格式如下:

  

部分开始...... ......部分结束部分开始...... ......   部分结束....

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

1 个答案:

答案 0 :(得分: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注释确保。