【问题标题】:How to get first line from file in Scala如何从Scala中的文件中获取第一行
【发布时间】:2012-02-10 12:48:41
【问题描述】:

我只想从 Scala 中的 CSV 文件中获取第一行,如果不使用 getLine(0)(它已被弃用),我该怎么做?

【问题讨论】:

    标签: parsing scala csv


    【解决方案1】:

    如果你不关心使用后释放文件资源,下面是一个非常方便的方式:

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

    【讨论】:

    • 从一个戴夫到另一个戴夫,此方法无法关闭文件描述符。经常这样做,最终会打开太多文件。
    【解决方案2】:

    如果你想关闭文件,并且你想得到一个空集合而不是在文件实际上是空的时候抛出错误,那么

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

    如果您将自己限制在标准库中,这是您可以做到的最短方法。

    【讨论】:

      【解决方案3】:

      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方法,这比转换为你不使用的中间List要好.
      4. 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)
        }
      }
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2012-07-24
          • 1970-01-01
          • 1970-01-01
          • 2020-08-24
          • 2011-08-13
          • 1970-01-01
          • 1970-01-01
          • 2011-04-06
          • 1970-01-01
          相关资源
          最近更新 更多