Wie der Scala-Skript, die 5G Protokolldatei von Netzlaufwerk liest sollte geändert werden, um letzte x Zeilen zu lesen (wie ‚Schwanz‘ in Unix)?

StackOverflow https://stackoverflow.com/questions/1669277

  •  13-09-2019
  •  | 
  •  

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)
}
}
War es hilfreich?

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 
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top