在 Scala 中将一个大日志文件拆分为多个文件
Splitting a large log file in to multiple files in Scala
我有一个很大的日志文件,每个日志行中的字段之一是客户端 ID。我想将这个大日志文件分成几个按客户端 ID 分组的文件。因此,如果原始文件有 10 行和 10 个唯一的客户端 ID,那么最后将有 10 个文件,每个文件有 1 行。
我正在尝试在 Scala 中执行此操作并且不想将整个文件加载到内存中,使用 scala.io.Source.getLines() 一次加载一行。这很好用。但是,我没有一个很好的方法来一次一行地将它写到单独的文件中。我可以想到两个选项:
为每一行创建一个由 BufferedWriter (Files.newBufferedWriter) 支持的新 PrintWriter。这似乎效率低下。
为每个输出文件创建一个由 BufferedWriter 支持的新 PrintWriter,保留这些 PrintWriter 并继续写入它们,直到我们读取原始日志文件中的所有行并关闭它们。在 Scala 中,这似乎不是一个非常实用的方法。
作为 Scala 的新手,我不确定是否有其他更好的方法来完成这样的事情。非常感谢任何想法或想法。
您可以在非常实用、惯用的 Scala 中执行第二个选项。您可以通过文件的行跟踪所有 PrintWriters
和 fold
:
import java.io._
import scala.io._
Source.fromFile(new File("/tmp/log")).getLines.foldLeft(Map.empty[String, PrintWriter]) {
case (printers, line) =>
val id = line.split(" ").head
val printer = printers.get(id).getOrElse(new PrintWriter(new File(s"/tmp/log_$id")))
printer.println(line)
printers.updated(id, printer)
}.values.foreach(_.close)
也许在生产级别的版本中,您希望将 I/O 操作包装在 try
(或 Try
)中,并以这种方式跟踪故障,同时最后仍然 closing
所有 PrintWriters
。
我有一个很大的日志文件,每个日志行中的字段之一是客户端 ID。我想将这个大日志文件分成几个按客户端 ID 分组的文件。因此,如果原始文件有 10 行和 10 个唯一的客户端 ID,那么最后将有 10 个文件,每个文件有 1 行。
我正在尝试在 Scala 中执行此操作并且不想将整个文件加载到内存中,使用 scala.io.Source.getLines() 一次加载一行。这很好用。但是,我没有一个很好的方法来一次一行地将它写到单独的文件中。我可以想到两个选项:
为每一行创建一个由 BufferedWriter (Files.newBufferedWriter) 支持的新 PrintWriter。这似乎效率低下。
为每个输出文件创建一个由 BufferedWriter 支持的新 PrintWriter,保留这些 PrintWriter 并继续写入它们,直到我们读取原始日志文件中的所有行并关闭它们。在 Scala 中,这似乎不是一个非常实用的方法。
作为 Scala 的新手,我不确定是否有其他更好的方法来完成这样的事情。非常感谢任何想法或想法。
您可以在非常实用、惯用的 Scala 中执行第二个选项。您可以通过文件的行跟踪所有 PrintWriters
和 fold
:
import java.io._
import scala.io._
Source.fromFile(new File("/tmp/log")).getLines.foldLeft(Map.empty[String, PrintWriter]) {
case (printers, line) =>
val id = line.split(" ").head
val printer = printers.get(id).getOrElse(new PrintWriter(new File(s"/tmp/log_$id")))
printer.println(line)
printers.updated(id, printer)
}.values.foreach(_.close)
也许在生产级别的版本中,您希望将 I/O 操作包装在 try
(或 Try
)中,并以这种方式跟踪故障,同时最后仍然 closing
所有 PrintWriters
。