【发布时间】:2012-02-10 12:48:41
【问题描述】:
我只想从 Scala 中的 CSV 文件中获取第一行,如果不使用 getLine(0)(它已被弃用),我该怎么做?
【问题讨论】:
我只想从 Scala 中的 CSV 文件中获取第一行,如果不使用 getLine(0)(它已被弃用),我该怎么做?
【问题讨论】:
如果你不关心使用后释放文件资源,下面是一个非常方便的方式:
Source.fromFile("myfile.csv").getLines.next()
【讨论】:
如果你想关闭文件,并且你想得到一个空集合而不是在文件实际上是空的时候抛出错误,那么
val myLine = {
val src = Source.fromFile("myfile.csv")
val line = src.getLines.take(1).toList
src.close
line
}
如果您将自己限制在标准库中,这是您可以做到的最短方法。
【讨论】:
FWIW,这就是我要做的(坚持使用标准库):
def firstLine(f: java.io.File): Option[String] = {
val src = io.Source.fromFile(f)
try {
src.getLines.find(_ => true)
} finally {
src.close()
}
}
注意事项:
Option[String] 而不是List[String],因为它总是返回一个或不返回。这是更惯用的 Scala。src 已正确关闭,即使您打开文件的可能性很小,但读取会引发异常.find(_ => true)获取Iterator的第一项并不让我感觉很好,但是没有nextOption方法,这比转换为你不使用的中间List要好.IOExceptions 打开或读取文件会被传递。我还建议使用 scala-arm 库,以便为您提供更好的 API 来管理资源并在需要时自动关闭文件。
import resource._
def firstLine(f: java.io.File): Option[String] = {
managed(io.Source.fromFile(f)) acquireAndGet { src =>
src.getLines.find(_ => true)
}
}
【讨论】:
我认为所有其他解决方案要么读入所有行,然后只保留第一行,要么不关闭文件。没有这些问题的解决方案是:
val firstLine = {
val inputFile = Source.fromFile(inputPath)
val line = inputFile.bufferedReader.readLine
inputFile.close
line
}
我只有 1 周的 Scala 经验,如果我错了,请纠正我。
【讨论】: