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

时间:2012-01-14 21:21:17

标签: parsing scala csv

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

4 个答案:

答案 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()
  }
}

注意事项:

  1. 该函数返回Option[String]而不是List[String],因为它总是返回一个或不返回。那是更惯用的Scala。
  2. src已正确关闭,即使您可能无法打开文件,但阅读会引发异常
  3. 使用.find(_ => true)获取Iterator的第一项并不会让我感觉很棒,但是没有nextOption方法,这比转换为中间{{}更好1}}你不使用。
  4. List打开或阅读文件将被传递。
  5. 我还建议使用scala-arm库为您提供更好的API来管理资源并在需要时自动关闭文件。

    IOException

答案 3 :(得分:1)

我认为所有其他解决方案要么在所有行中读取,然后只保留第一行,要么不关闭文件。没有这些问题的解决方案是:

val firstLine = {
  val inputFile = Source.fromFile(inputPath)
  val line = inputFile.bufferedReader.readLine
  inputFile.close
  line
}

我只有1周的Scala经验,如果我错了,请纠正我。