高效迭代大文本文件

时间:2017-11-23 09:29:08

标签: scala iterator bigdata

所以我有以下内容:

val bufferedSource = io.Source.fromFile("""C:\Users\something\workspace\""" + fileName)
val lines = bufferedSource.getLines

我想随机选择一个起始索引和一个结束索引,并在打印到新文件时在此范围内迭代lines。有没有办法按索引访问lines迭代器中的元素?

我的第一次尝试是将数据复制到ListBuffer

var lineArr = ListBuffer[String]()
for (line <- lines) {
    lineArr += line
}

Therafter如果我按照索引在我的范围内迭代lineArr,那么它真的很慢。

我能以什么方式有效地做到这一点?

旁注:如果我遍历lines包含所有元素(我不想要),那么在将它们写入新文件时迭代很快,但我只想要一个选择的数量来写。

3 个答案:

答案 0 :(得分:2)

因此,我没有遍历每一行,而是使用切片解决了这个问题。我仍然创建一个ListBuffer但我在开始和结束索引上切片:

lineArrTemp = lineArrTemp.slice(start, end)

此后只需遍历ListBuffer迭代器,效率很高。

答案 1 :(得分:1)

  lines
    .drop(startIndex)
    .take(endIndex - startIndex)
    .foreach(writeToFile)

答案 2 :(得分:0)

在迭代器上也考虑zipWithIndex,因此我们可以根据索引值来完善行选择;例如,选择带有

的索引行
io.Source.fromFile("temp.txt").getLines.zipWithIndex.foreach { 
  case (line,i) => if (i % 2 == 0) println(line) 
}

这里我们一次索引一行,因为我们只迭代文件一次。