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 に答える