加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala中修改大文件

发布时间:2020-12-16 18:43:29 所属栏目:安全 来源:网络整理
导读:我试图修改 Scala中的大型PostScript文件(有些大小只有1GB).该文件是一组批次,每批包含代表批号,页数等的代码. 我需要: 在文件中搜索批次代码(始终以文件中的同一行开头) 计算下一批代码之前的页数 修改批次代码以包括每批中的页数. 将新文件保存在其他位置
我试图修改 Scala中的大型PostScript文件(有些大小只有1GB).该文件是一组批次,每批包含代表批号,页数等的代码.

我需要:

>在文件中搜索批次代码(始终以文件中的同一行开头)
>计算下一批代码之前的页数
>修改批次代码以包括每批中的页数.
>将新文件保存在其他位置.

我当前的解决方案使用从Source.fromFile(“file.ps”).getLines创建的两个迭代器(iterA和iterB).第一个迭代器(iterA)在while循环中遍历到批处理代码的开头(每次都调用iterB.next). iterB然后继续搜索直到下一个批处理代码(或文件的末尾),计算它经过的页面数量.然后,它在iterA的位置更新批处理代码,重复该过程.

这似乎非Scala-like,我仍然没有设计好将这些更改保存到新文件的方法.

解决这个问题的好方法是什么?我应该完全抛弃迭代器吗?我最好喜欢这样做而不必将整个输入或输出同时存入内存.

谢谢!

解决方法

您可以使用Scala的Stream类实现此功能.我假设你不介意
一次在内存中保存一个“批处理”.

import scala.annotation.tailrec
import scala.io._

def isBatchLine(line:String):Boolean = ...

def batchLine(size: Int):String = ...

val it = Source.fromFile("in.ps").getLines
// cannot use it.toStream here because of SI-4835
def inLines = Stream.continually(i).takeWhile(_.hasNext).map(_.next)

// Note: using `def` instead of `val` here means we don't hold
// the entire stream in memory
def batchedLinesFrom(stream: Stream[String]):Stream[String] = {
  val (batch,remainder) = stream span { !isBatchLine(_) }
  if (batch.isEmpty && remainder.isEmpty) { 
    Stream.empty
  } else {
    batchLine(batch.size) #:: batch #::: batchedLinesFrom(remainder.drop(1))
  }
}

def newLines = batchedLinesFrom(inLines dropWhile isBatchLine)

val ps = new java.io.PrintStream(new java.io.File("out.ps"))

newLines foreach ps.println

ps.close()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读