1

如何修改从网络驱动器读取 5G 日志文件的 Scala 脚本以读取最后 x 行(如 Unix 中的“tail”)?

::#!
@echo off
call scala %0 %*
goto :eof
::!#

import scala.io.Source
if (args.length > 0) {
for (line <-Source.fromFile(args(0)).getLines)
if(line.contains("percent")){
    print(line)
}
}
4

3 回答 3

2

我在这个中使用了一个可变队列:

::#!@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,但我认为为此使用不可变队列毫无意义。

于 2009-11-03T20:24:52.103 回答
2

如果读取文件很昂贵,正如我所期望的那样,它是通过网络读取的,我会寻找文件的末尾并从结束,直到你找到你正在寻找的行数。

于 2009-11-03T21:48:59.993 回答
0

您显然必须保留在每次迭代时更新的 x 行缓冲区:

var buf: List[String] = Nil

for (line <- ...) {
  buf = (buf ::: List(line)) match {
    case x :: xs if (xs.length == n) => xs 
  }
}
于 2009-11-03T19:12:01.363 回答