如何读取scala中文件的第一行和最后一行

时间:2017-07-05 18:27:48

标签: scala file

我正在阅读包含以下内容的文件:

16,44,34
16,47,18
22,44,28
22,47,24

但我只想阅读文件的第一行和最后一行, 在这一刻,我正在读取文件作为迭代器:

 while (in2.hasNext) {
        val s  = in2.next(',').toInt
        val p = in2.next(',').toInt
        val o  = in2.next('\n').toInt
 }

但我正在阅读整个文件,在scala中存在一种方法吗?

1 个答案:

答案 0 :(得分:3)

好吧,你可以把它写得更好一点,除了不必解析文件中的每一行,但你仍然必须读取它们全部,除非你愿意做一些杂技与随机访问文件和二进制数据(可能,不值得努力,除非文件是真正巨大)。

   val lines = Source.fromFile("input_file.csv").getLines
   val firstLine = if(lines.hasNext) Some(lines.next) else None
   val lastLine = lines.foldLeft(Option.empty[String]) { case (_, line) => Some(line) }
   val spos: Seq[Seq[Int]] = (firstLine ++ lastLine).map(_.split(",").map(_.toInt))

   // next line will fail if there are fewer than two lines in the file
   // or if either first or last line doesn't have exactly three comma-separated fields
   // I am just putting it here to illustrate how you could extract the parsed data

   val Seq(Seq(s1, p1, o1), Seq(s2, p2, o2)) = spos

更新

好吧,如果你真的不想阅读整个文件,你可以尝试这样的事情(这是一种粗略的方法,基于你的线都很短的事实,所以我可以肯定如果我从文件的末尾到达大约1000个字节的地方,我肯定会在最后一行开始之前就好了。

   val file = new RandomAccessFile("input_file.csv", "r")
   val firstLine = Option(file.readLine)
   if(file.length > 1024 + firstLine.fold(0)(_.length))
      file.skipBytes(file.length - 1024)
   val lastLine = Iterator.continually(file.readLine)
     .takeWhile(_ != null)
     .foldLeft(Option.empty[String]) { case (_, line) => line }

(早期片段的其余部分可以保持不变)。