2010-07-27 99 views
2

scala.io.Source的getLines()方法從它返回的行中剝離\ r和\ n。我反而希望將這些字符保留在返回的字符串中。閱讀Scala 2.7中的文件行,保留行結束符

getLines'評論說:

返回線(不包括換行符(S))[...]如果你需要更精緻的行爲,那麼可以繼承源#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,並且一直在Google上搜索,沒有運氣。

任何建議將受到感謝。謝謝。

回答

2

由於您可能繼承scala.io.Source本身,爲什麼不重寫getLines()方法並返回您的類不重寫LineIterator,而是提供您需要的完全功能?毫無疑問,評論是誤導性的。

+0

是的,我想我要帶你建議的方法。謝謝。 – owst 2010-07-30 11:26:46

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, "###")) 
    } 
}