Scala脚本如何读取 5G </跨度> 应该修改网络驱动器的日志文件,以便读取最后的x行(比如Unix中的’tail’)?
::#!@echo关闭调用scala%0%*转到:eof::#!
导入
我在这个中使用了一个可变队列:
::#!@echo off call scala %0 %* goto :eof ::!# import scala.io.Source val lastN = 5 // I guess you'll be getting them from args, but... val queue = new scala.collection.mutable.Queue[String] if (args.length > 0) { Source.fromFile(args(0)).getLines foreach { line => queue.enqueue(line) if (queue.size > lastN) queue.dequeue } for (line <- queue) if (line.contains("percent")){ print(line) } }
如果使用不可变队列,我会使用reduceLeft,但我认为使用不可变队列没有意义。
如果读取文件是昂贵的,正如我所期望的那样是通过网络,我会寻找文件的末尾并逐步读取更大的块(更多关于日志文件格式的领域知识可能会给你一个更好的策略)结束,直到找到您要查找的行数。
你显然必须保留x行的缓冲区,你在每次迭代时都会更新:
var buf: List[String] = Nil for (line <- ...) { buf = (buf ::: List(line)) match { case x :: xs if (xs.length == n) => xs } }