spark - scala try catch throw exception
¿Cómo resolver java.nio.charset.UnmappableCharacterException en Scala 2.8.0? (4)
Estoy usando Scala 2.8.0 y trato de leer un archivo delimitado por tuberías como en el código cortado 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 hilo "main" java.nio.charset.UnmappableCharacterException: Longitud de entrada = 1 en java.nio.charset.CoderResult.throwException (CoderResult.java:261) en sun.nio.cs.StreamDecoder.implRead (StreamDecoder.java) 319) en sun.nio.cs.StreamDecoder.read (StreamDecoder.java:158) en java.io.InputStreamReader.read (InputStreamReader.java:167) en java.io.BufferedReader.fill (BufferedReader.java:136) en java.io.BufferedReader.read (BufferedReader.java:157) en scala.io.BufferedSource $$ anonfun $ 1 $$ anonfun $ apply $ 1.apply (BufferedSource.scala: 29) en scala.io.BufferedSource $$ anonfun $ 1 $ $ anonfun $ apply $ 1.apply (BufferedSource.scala: 29) en scala.io.Codec.wrap (Codec.scala: 65) en scala.io.BufferedSource $$ anonfun $ 1.apply (BufferedSource.scala: 29) en scala .io.BufferedSource $$ anonfun $ 1.apply (BufferedSource.scala: 29) en scala.collection.Iterator $$ anon $ 14.siguiente (Iterator.scala: 149) en scala.collection.Iterator $$ anon $ 2.siguiente (Iterator .scala: 745) en scala.collection.Iterator $$ anon $ 2.head (Iterator.scala: 732) en scala.col lection.Iterator $$ anon $ 24.hasNext (Iterator.scala: 405) en scala.collection.Iterator $$ anon $ 20.hasNext (Iterator.scala: 320) en scala.io.Source.hasNext (Source.scala: 209) en scala.collection.Iterator $ class.foreach (Iterator.scala: 534) en scala.io.Source.foreach (Source.scala: 143) ... en infillreports.Main $ .main (Main.scala: 8) en infillreports.Main.main (Main.scala) Resultado de Java: 1
Esta quizás 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, puede evitar los datos mal formados en el archivo.
Estaba luchando con este mismo problema y esta respuesta me ayudó. Quería extenderme en el comentario de seh sobre el "por qué funciona esto". La respuesta debe estar en la firma del método:
def fromFile(file: JFile)(implicit codec: Codec): BufferedSource
Toma un parámetro de codec implícito. Sin embargo, en el ejemplo, se proporciona una cadena, no un códec. Una segunda traducción se está realizando entre bastidores: el objeto complementario de la clase Codec define un método de aplicación de String:
def apply(encoding: String): Codec
así que el compilador ha hecho algún trabajo para nosotros: líneas val = Source.fromFile (someFile) (Codec ("UTF-8"))
Dado que el códec es implícito, si llama a este método varias veces, también puede crear un objeto de códec en el alcance de su llamada:
implicit val codec = Codec("UTF-8")
val lines = Source.fromFile(someFile)
val moreLines = Source.fromFile(someOtherFile)
Espero haberlo hecho bien (todavía soy un Scala n00b, tengo mis habilidades de control, siéntase libre de corregir cuando sea necesario)
Para agregar a la respuesta de Daniel C. Sobral, también puedes probar algo como esto:
val products = Source.fromFile("products.txt")("UTF-8").getLines().toList;
for(p <- products){
println("product :" + p);
}
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)
}
}
}