Wie der Scala-Skript, die 5G Protokolldatei von Netzlaufwerk liest sollte geändert werden, um letzte x Zeilen zu lesen (wie ‚Schwanz‘ in Unix)?
Frage
Wie der Scala-Skript, die 5G Protokolldatei von Netzlaufwerk liest sollte geändert werden, um letzte x Zeilen zu lesen (wie ‚Schwanz‘ in Unix)?
::#!
@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)
}
}
Lösung
Ich verwende eine veränderbare Warteschlange in dieser:
::#!@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)
}
}
eine unveränderliche Warteschlange Bei Verwendung, ich reduceLeft verwenden würde, aber ich sehe keinen Sinn in eine unveränderliche Warteschlange für diese verwendet wird.
Andere Tipps
Wenn Sie die Datei zu lesen teuer ist, wie ich es erwartet das Netzwerk ist vorbei, würde ich bis zum Ende der Datei suchen und zunehmend größere Stücke (mehr Domänenwissen des Protokolldateiformat lesen könnte Ihnen eine bessere Strategie hier ) vom Ende, bis Sie die Anzahl der Zeilen finden Sie suchen.
Sie werden offensichtlich einen Puffer von x Linien halten müssen, die Sie bei jeder Iteration aktualisiert werden:
var buf: List[String] = Nil
for (line <- ...) {
buf = (buf ::: List(line)) match {
case x :: xs if (xs.length == n) => xs
}
}