在scala中读取文本文件,一行接一行,不迭代
Reading a text file in scala, one line after the other, not iterated
我正在尝试用 Scala 打开一个文本文件,读取第一行,然后是第二行,然后是第三行。
我在网上找到的所有示例都希望将整个文件 read/buffer 放入列表或数组中,然后从该构造中访问各个行。
这段代码不能像上面描述的那样工作(当然)。
它将整个文件读入 "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);
}
}
我可以使用什么 idiom/function 一次读取一行...而不使用 list/array 作为中间步骤。
如评论中所述,.mkString
将获取迭代器将要 return 的所有元素并将它们连接成一个字符串。
如果您已经知道文件中始终至少有三行,那么 @Régis Jean-Gilles 选项可能是最好的选择。
另一种选择是调用 getLines()
,然后调用 grouped(3)
以获得一个迭代器,该迭代器将元素分组为 3 个块。调用 next()
将为您提供一个列表,最多三个元素(如果迭代器只剩下两个元素,例如 return,它可以有更少的元素)。
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
。
我相信您也应该在阅读后适当关闭文件以释放资源。以下是您要查找的代码:
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()
}
我正在尝试用 Scala 打开一个文本文件,读取第一行,然后是第二行,然后是第三行。
我在网上找到的所有示例都希望将整个文件 read/buffer 放入列表或数组中,然后从该构造中访问各个行。
这段代码不能像上面描述的那样工作(当然)。 它将整个文件读入 "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);
}
}
我可以使用什么 idiom/function 一次读取一行...而不使用 list/array 作为中间步骤。
如评论中所述,.mkString
将获取迭代器将要 return 的所有元素并将它们连接成一个字符串。
如果您已经知道文件中始终至少有三行,那么 @Régis Jean-Gilles 选项可能是最好的选择。
另一种选择是调用 getLines()
,然后调用 grouped(3)
以获得一个迭代器,该迭代器将元素分组为 3 个块。调用 next()
将为您提供一个列表,最多三个元素(如果迭代器只剩下两个元素,例如 return,它可以有更少的元素)。
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
。
我相信您也应该在阅读后适当关闭文件以释放资源。以下是您要查找的代码:
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()
}