2010-07-27 2 views
2

La méthode getLines() des bandes scala.io.Source et des lignes qu'elle renvoie. Je préfère garder ces caractères dans les chaînes renvoyées.Lire les lignes d'un fichier dans Scala 2.7, en conservant les terminaisons de ligne

commentaire de getLines dit:

si vous avez besoin un comportement plus raffiné, vous pouvez sous-classe Source # LineIterator lignes

retours (non compris le caractère de nouvelle ligne (s)) [...]

I J'ai essayé de sous-classer LineIterator, mais j'ai des problèmes (et peut-être un simple malentendu!).

Je veux quelque chose comme:

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 
     } 
    } 
} 

Mais je frappé deux problèmes majeurs:
1) Type LineIterator ne se trouve pas, même si je importation scala.io.Source._
2) Je suis à peu près sûr que je ne peux pas accéder à sb, car c'est privé [this] dans LineIterator.

Est-ce que quelqu'un a déjà voulu faire ça? C'est une chose assez étrange à vouloir faire, mais je veux le faire :).

J'ai jeté un coup d'œil à scalax et ai fait des recherches sur google pendant un moment, sans chance.

Toutes les suggestions seront les bienvenues. Merci.

Répondre

2

Puisque vous sous-classez probablement scala.io.Source lui-même, pourquoi ne pas surcharger la méthode getLines() et renvoyer votre classe ne remplaçant pas LineIterator, mais fournissant exactement la fonctionnalité dont vous avez besoin? Le commentaire est trompeur cependant, sans aucun doute.

+0

Oui, je pense que je vais devoir prendre l'approche que vous proposez. Merci. – owst

0

Une façon ont séparateur de ligne personnalisé

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