在scala中读取文本文件,一行接一行,不迭代

Posted

技术标签:

【中文标题】在scala中读取文本文件,一行接一行,不迭代【英文标题】:Reading a text file in scala, one line after the other, not iterated 【发布时间】:2015-06-16 09:30:52 【问题描述】:

我正在尝试使用 Scala 打开一个文本文件,读取第一行,然后是第二行,然后是第三行。

我在网上找到的所有示例都希望将整个文件读取/缓冲到列表或数组中,然后访问该构造中的各个行。


这个代码不能像上面描述的那样工作(当然)。 它将整个文件读入“first”,因为“file”是一个 BufferedStream,而 getLines 会按原样获取所有行。

import scala.io.Source;
object ScalaDemo 
  def main(args: Array[String]) = 
    val file = io.Source.fromFile("TextFile.txt");

    // -----------------------------------------------
    // read text from file, line by line, no iterator
    // -----------------------------------------------
    val first    = file.getLines().mkString;
    val second   = file.getLines().mkString; 
    val third    = file.getLines().mkString; 

    // Close the file   
    file.close;

    println(first+"|"+second+"|"+third); 
    

我可以使用什么习语/函数一次读取一行...而不使用列表/数组作为中间步骤。

【问题讨论】:

读取 3 行而不检查错误(特别是文件可能少于 3 行)并不是很安全,但如果你没有错误检查没问题,你可以做 @ 987654322@ 你的问题是什么? gelLines 返回一个迭代器,所以你只需要迭代。您的代码是错误的,因为您使用 mkString,它将整个 Seq 转换为一个字符串 【参考方案1】:

如 cmets 中所述,.mkString 将获取迭代器将返回的所有元素并将它们连接到单个字符串中。

如果您已经知道文件中始终至少包含三行,那么@Régis Jean-Gilles 选项可能是最好的。

另一种选择是调用 getLines() 后跟 grouped(3) 以获取将元素分组为 3 个块的迭代器。调用 next() 将为您提供一个最多包含三个元素的列表(如果例如,迭代器只剩下两个要返回的元素)。

val ite = io.Source.fromFile("textfile.txt").getLines().grouped(3)

//list with the first three elements, if any -  
//otherwise an empty list if the file is empty
val list = if(ite.hasNext()) ite.next() else Nil 

如果文件中的行数少于 3 行,至少它可以确保您在运行时不会有 NoSuchElementException

【讨论】:

我可以将其称为 val ite = io.Source.fromFile("textfile.txt").getLines().grouped(1) 然后使用 hasNext/next 方法逐行读取? @lexu 你不需要grouped(1) 来逐行阅读。这是一种无操作。【参考方案2】:

我相信你也应该在阅读后正确关闭文件以释放资源。以下是您要查找的代码:

import scala.io.Source

def main(args: Array[String]): Unit = 

var itr = Source.fromFile("input.txt")
var buffer = itr.getLines()

var line1 = buffer.next()
var line2 = buffer.next()
var line3 = buffer.next()
var line4 = buffer.next()

println("line1 "+line1+" \nline2 "+line2+" \nline3 "+line3+" \nline4 "+line4)

itr.close()
 

【讨论】:

这个 2 年前的问题中提供的示例代码已经确实关闭了文件。您错过了问题的重点,没有提供有用的答案。

以上是关于在scala中读取文本文件,一行接一行,不迭代的主要内容,如果未能解决你的问题,请参考以下文章

从文本文件中读取一行,然后用新文本 C# 替换同一行

在java中如何修改文本文件中的某一行的某些数据??

javascript一行一行的读取文本

python读取指定目录中所有文本文件的第一行,并以此为该文本文件名重命名

我如何使用scanf读取文本文件中的下一行

用python读取文本文件,对读出的每一行进行操作,这个怎么写?