代码之家  ›  专栏  ›  技术社区  ›  osk

大型文本文件的高效迭代

  •  2
  • osk  · 技术社区  · 7 年前

    因此,我有以下几点:

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

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

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

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

    如果我遍历 lineArr 在我的范围内,从指数来看,它真的很慢。

    我怎样才能有效地做到这一点?

    旁注:如果我遍历 线 它包含所有元素(我不想要),在将它们写入新文件时迭代速度很快,但是我只想要选择的写入量。

    3 回复  |  直到 7 年前
        1
  •  2
  •   osk    7 年前

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

    lineArrTemp = lineArrTemp.slice(start, end)
    

    然后简单地遍历 列表缓冲区 迭代器,它是有效的。

        2
  •  1
  •   Dima    7 年前
      lines
        .drop(startIndex)
        .take(endIndex - startIndex)
        .foreach(writeToFile)
    
        3
  •  0
  •   elm    7 年前

    同时考虑 zipWithIndex 在迭代器上,因此我们可以根据索引值完善行选择;例如,使用

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

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