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,即使我有导入scala.io.Source._
2)我很确定我无法访问sb,因为它是LineIterator中的私有[this]。
有没有人想要这样做?这是一件相当奇怪的事情,但我确实想这样做:)。
我偷看了scalax并且谷歌搜索了一段时间,没有运气。
我们将非常感激地收到任何建议。感谢。
答案 0 :(得分:2)
既然你可能是scala.io.Source本身的子类,为什么不覆盖getLines()方法并返回你的类而不是重写LineIterator,但是提供你需要的功能呢?毫无疑问,评论是误导。
答案 1 :(得分:0)
单向具有自定义行分隔符
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, "###"))
}
}