如何从Scala中的文件获取第一行

dav*_*ave 5 csv parsing scala

我想从Scala中的CSV文件中获取第一行,如何在不使用getLine(0)的情况下进行此操作(不推荐使用)?

zig*_*tar 11

如果您在使用后不关心释放文件资源,以下是一种非常方便的方式:

Source.fromFile("myfile.csv").getLines.next()

  • 从一个dave到另一个,这个方法无法关闭文件描述符.经常这样做,你最终会打开太多文件. (3认同)

Rex*_*err 10

如果要关闭文件,并且想要获取空集合而不是在文件实际为空时抛出错误,那么

val myLine = {
  val src = Source.fromFile("myfile.csv")
  val line = src.getLines.take(1).toList
  src.close
  line
}
Run Code Online (Sandbox Code Playgroud)

如果你限制自己使用标准库,那么你可以做到最短的方式.


lee*_*777 9

FWIW,这就是我要做的事情(坚持使用标准库):

def firstLine(f: java.io.File): Option[String] = {
  val src = io.Source.fromFile(f)
  try {
    src.getLines.find(_ => true)
  } finally {
    src.close()
  }
}
Run Code Online (Sandbox Code Playgroud)

注意事项:

  1. 该函数返回Option[String]而不是List[String],因为它总是返回一个或没有.这更像是惯用的Scala.
  2. src关好,即使是在非常起飞的机会,你可以打开该文件,但看完抛出一个异常
  3. 使用.find(_ => true)获取第一项Iterator不会让我感觉很好,但是没有nextOption方法,这比转换为List不使用的中间件更好.
  4. IOException打开或读取文件传递.

我还建议使用scala-arm库为您提供更好的API来管理资源并在需要时自动关闭文件.

import resource._

def firstLine(f: java.io.File): Option[String] = {
  managed(io.Source.fromFile(f)) acquireAndGet { src =>
    src.getLines.find(_ => true)
  }
}
Run Code Online (Sandbox Code Playgroud)