在 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 之后保留最近的行

从CSV中的行读取值时丢失字符串中的最后一个字符

如何从子进程 python 2.7 和 Apache 读取实时输出

多平台 C++ 项目和 CMakeLists.txt 源中的行终止

如何在 Play 2.7 for Scala 中编写一个通用 JSON 解析器来验证入站请求?

在一个非常大的文件中逐行读取特定的行