我想从Scala中的CSV文件中获取第一行,如何在不使用getLine(0)的情况下进行此操作(不推荐使用)?
答案 0 :(得分:10)
如果你不关心在使用它之后释放文件资源,以下是一种非常方便的方式:
Source.fromFile("myfile.csv").getLines.next()
答案 1 :(得分:10)
如果要关闭文件,并且想要获取空集合而不是在文件实际为空时抛出错误,那么
val myLine = {
val src = Source.fromFile("myfile.csv")
val line = src.getLines.take(1).toList
src.close
line
}
如果你把自己局限于标准库,那么就是你可以做到的最短路。
答案 2 :(得分:8)
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
方法,这比转换为中间{{}更好1}}你不使用。List
打开或阅读文件将被传递。我还建议使用scala-arm库为您提供更好的API来管理资源并在需要时自动关闭文件。
IOException
答案 3 :(得分:1)
我认为所有其他解决方案要么在所有行中读取,然后只保留第一行,要么不关闭文件。没有这些问题的解决方案是:
val firstLine = {
val inputFile = Source.fromFile(inputPath)
val line = inputFile.bufferedReader.readLine
inputFile.close
line
}
我只有1周的Scala经验,如果我错了,请纠正我。