在 Scala 2.7 中读取文件的行,保留行终止符
Posted
技术标签:
【中文标题】在 Scala 2.7 中读取文件的行,保留行终止符【英文标题】:Read a file's lines in Scala 2.7, keeping line terminators 【发布时间】:2010-07-27 20:05:46 【问题描述】:scala.io.Source 的 getLines() 方法从它返回的行中去除 \r 和 \n。相反,我想将这些字符保留在返回的字符串中。
getLines 评论说:
返回行(不包括换行符)[...]如果您需要更精细的行为,您可以继承 Source#LineIterator
我尝试继承 LineIterator,但我遇到了麻烦(并且可能是纯属误解!)。
我想要类似的东西:
class FullLineIterator() extends LineIterator
// Don't strip \r?\n
override def getc() = iter.hasNext &&
val ch = iter.next
if (ch == '\n')
sb append ch
false
else if (ch == '\r')
sb append ch
if (iter.hasNext && iter.head == '\n')
iter.next
sb append iter.head
false
else
sb append ch
true
但我遇到了几个主要问题: 1) 找不到类型 LineIterator,即使我有 import scala.io.Source._ 2) 我很确定我无法访问 sb,因为它在 LineIterator 中是私有的[this]。
有没有人想这样做?这是一件相当奇怪的事情,但我确实想这样做:)。
我偷看了 scalax 并在谷歌上搜索了一段时间,但没有运气。
我们将不胜感激地收到任何建议。谢谢。
【问题讨论】:
【参考方案1】:既然您可能继承了 scala.io.Source 本身,为什么不重写 getLines() 方法并返回您的类而不是重写 LineIterator,而是提供您需要的功能?然而,毫无疑问,该评论具有误导性。
【讨论】:
是的,我想我必须采用您建议的方法。谢谢。【参考方案2】:一种方式有自定义行分隔符
import scala.io.Source
object EdiSource
class SegIterator(val it: Iterator[Char], sep: Char) extends Iterator[String]
val sb = new StringBuilder
def hasNext = it.hasNext
def next =
sb.clear
var ch: Char = 0
while (it.hasNext && ch = it.next; ch != sep) sb.append(ch)
sb.toString
def fromFile(path: String, sep: Char = ' ') = new SegIterator(Source.fromFile(path), sep)
object Main
def main(args: Array[String]): Unit =
EdiSource.fromFile("Z:\\input.txt", 'i').foreach(line => println("###", line, "###"))
【讨论】:
以上是关于在 Scala 2.7 中读取文件的行,保留行终止符的主要内容,如果未能解决你的问题,请参考以下文章
在 groupBy scala spark 之后保留最近的行
如何从子进程 python 2.7 和 Apache 读取实时输出
多平台 C++ 项目和 CMakeLists.txt 源中的行终止