Estoy usando Scala 2.8.0 y tratando de leer tubo de archivo delimitado como en el código cortada a continuación:

object Main {
  def main(args: Array[String]) :Unit = {
    if (args.length > 0) {
      val lines = scala.io.Source.fromPath("QUICK!LRU-2009-11-15.psv")
     for (line <-lines)
       print(line)
    }
  }
}

Aquí está el error:

Excepción en el thread «main» java.de nio.conjunto de caracteres.UnmappableCharacterException: Entrada de longitud = 1
en java.de nio.conjunto de caracteres.CoderResult.throwException(CoderResult.java:261)
en el sol.de nio.cs.StreamDecoder.implRead(StreamDecoder.java:319)
en el sol.de nio.cs.StreamDecoder.leer(StreamDecoder.java:158)
en java.io.InputStreamReader.leer(InputStreamReader.java:167)
en java.io.Clases bufferedreader.relleno(clases bufferedreader.java:136)
en java.io.Clases bufferedreader.leer(clases bufferedreader.java:157)
en scala.io.BufferedSource$$anonfun$1$$anonfun$aplica$1.aplicar(BufferedSource.scala:29)
en scala.io.BufferedSource$$anonfun$1$$anonfun$aplica$1.aplicar(BufferedSource.scala:29)
en scala.io.Códec.wrap(Códec.scala:65)
en scala.io.BufferedSource$$anonfun$1.aplicar(BufferedSource.scala:29)
en scala.io.BufferedSource$$anonfun$1.aplicar(BufferedSource.scala:29)
en scala.de la colección.Iterador$$anon$14.siguiente(Iterador.scala:149)
en scala.de la colección.Iterador$$anon$2.siguiente(Iterador.scala:745)
en scala.de la colección.Iterador$$anon$2.cabeza(Iterador.scala:732)
en scala.de la colección.Iterador$$anon$24.hasNext(Iterador.scala:405)
en scala.de la colección.Iterador$$anon$20.hasNext(Iterador.scala:320)
en scala.io.Fuente.hasNext(de Origen.scala:209)
en scala.de la colección.Iterador$clase.foreach(Iterador.scala:534)
en scala.io.Fuente.foreach(de Origen.scala:143)

en infillreports.Principal$.principal(Main.scala:8)
en infillreports.Principal.principal(Main.scala)
Java Resultado: 1

InformationsquelleAutor Roman Kagan | 2009-11-18

4 Comentarios

  1. 24
    object Main {
      def main(args: Array[String]) :Unit = {
        if (args.length > 0) {
          val lines = scala.io.Source.fromPath("QUICK!LRU-2009-11-15.psv")("UTF-8")
          for (line <-lines)
            print(line)
        }
      }
    }
    • Espero que usted tome el tiempo para entender por qué la adición de «UTF-8» he aquí que era necesario, y cómo ha cambiado el comportamiento de la lectura de los caracteres de la secuencia de entrada. Si no lo recibe, por favor, pon tu pregunta aquí, o hacer una nueva pregunta sobre bytes, caracteres y codificaciones de caracteres.
    • En scala 2.12.3 que debes escribir de Origen.fromFile(nombre de archivo)(Códec(«utf-8»))
    • importación de scala.io.{Fuente, El Códec}
  2. 7

    Yo estaba luchando con este mismo tema, y esta respuesta me ayudó. Quería extender en el comentario de la seh sobre el ‘por qué esto funciona». La respuesta debe estar en la firma del método:

    def fromFile(file: JFile)(implicit codec: Codec): BufferedSource

    Lleva implícito un códec de parámetro. Sin embargo, en el ejemplo, una cadena es siempre, no un codec. Una segunda traducción está ocurriendo detrás de las escenas:
    El compañero de objetos de la clase que define un Códec de aplicar el método de la Cadena:

    def apply(encoding: String): Codec

    por lo que el compilador ha realizado algún trabajo por nosotros:
    val líneas = Fuente.fromFile(someFile)(Códec(«UTF-8»))

    Dado que Codec es implícito, si se llama a este método varias veces, usted puede también crear un Códec de objeto en el ámbito de su llamada:

    implicit val codec = Codec("UTF-8")
    val lines = Source.fromFile(someFile)
    val moreLines = Source.fromFile(someOtherFile)

    Espero que me de ese derecho (todavía estoy en Scala n00b, haciendo que me agarra en el es – siéntase libre de corregir donde sea necesario)

    • En realidad, desde Codec.apply no es una conversión implícita, no hay ninguna razón para que el compilador silencio llamarlo. De hecho, en su es Codec.string2codec que se llama aquí (como se una conversión implícita de String a Codec)
  3. 4

    Para agregar a Daniel C. Sobral de la respuesta, usted puede también intentar algo como esto:

    val products = Source.fromFile("products.txt")("UTF-8").getLines().toList;
    
    for(p <- products){
            println("product :" + p);
    }
  4. 1

    Esto puede ser una solución más genérica:

    implicit val codec = Codec("UTF-8")
    codec.onMalformedInput(CodingErrorAction.REPLACE)
    codec.onUnmappableCharacter(CodingErrorAction.REPLACE)

    con las dos configuraciones, usted puede evitar la malformación de los datos en el archivo.

    • Hola, quería probar su solución, ya que el aceptado la respuesta no resuelve mi problema. Pero no se compila, ya que el compilador no reconoce el valor CodingErrorAction.REEMPLACE. He importado scala.io._, que el espacio de nombres que me estoy perdiendo?
    • Le falta java.nio.charset.CodingErrorAction

Dejar respuesta

Please enter your comment!
Please enter your name here