在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() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |