2009-11-18 18 views
17

Ben Scala 2.8.0 kullanıp aşağıdaki snipped kodda gibi boru ayrılmış dosyayı okumaya çalışıyorum: iplik "ana" java.nio.charset içindeScala 2.8.0'da java.nio.charset.UnmappableCharacterException nasıl çözümlenir?

İstisna:

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

İşte hatadır. UnmappableCharacterException: sun.nio.cs.StreamDecoder.implRead (StreamDecoder.java:319) giriş uzunluğu = java.nio.charset.CoderResult.throwException (CoderResult.java:261) 1 sun.nio.cs. de StreamDecoder.read (StreamDecoder.java:158) java.io.InputStreamReader.read (InputStreamReader.java:167)Java.io.BufferedReader.fill (BufferedReader.java:136) at java.io.BufferedReader.read (BufferedReader.java:157) at scala.io.BufferedSource $$ anonfun $ 1 $$ anonfun $ 1 dolara uygulayın. scala.io.BufferedSource $$ anonfun at 1 $ ($ 1) $ anonfun $ 1apply (BufferedSource.scala: 29) at (BufferedSource.scala: 29) uygulayın scala.io.Codec.wrap (Codec.scala: 65) Scala.io.BufferedSource adresinden , $ 1.apply (BufferedSource.scala: 29) scala.io.BufferedSource adresinden , $ 1.apply (BufferedSource.scala: 29) , scala.collection.Iterator $$ anon $ 14.next (Iterator.scala: 149) scala.collection.Iterator adresindeki , anon $ 2.next (Iterator.scala: 745) scala.collection.Iterator adresindeki adresinden anon $ 2.head (Iterator.scala: 732) at scala.collection.Iterator $$ anon $ 24.hasNext (Iterator.scala: 405) scala.collection.Iterator üzerinde $ anon $ 20.hasNext (Iterator.scala: 320) at scala.io.Source.hasNext (Kaynak. scala: 209) scala.collection.Iterator $ class.foreach (Iterator.scala: 534) at scala.io.Source.foreach (Kaynak: http: 143) ... at infillreports.Main $ .main (Main.scala: 8) infillreports.Main.main (Main.scala) Java Sonuç olarak: 1

cevap

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) 
    } 
    } 
} 
+1

Sadece AWESOME iseniz !!!! Çok teşekkür ederim. –

+0

Umarim "UTF-8" eklemenin niçin gerekli oldugunu ve giris akisindan karakterlerin okunmasinin davranisini nasil degistirdiğini anlamanizi umarim. Anlamadıysanız, lütfen sorunuzu burada ayrıntılı olarak belirtin veya baytlar, karakterler ve karakter kodlamaları ile ilgili yeni bir soru sorun. – seh

+1

Scala 2.12.3'te yazıyorsunuz Kaynak.fromFile (dosyaAdı) (Codec ("utf-8")) –

7

Bu aynı sorunu ile mücadele ve bu cevap bana yardımcı oldu. 'Neden bu işe yarıyor' ile ilgili yorum üzerine genişletmek istedim. cevap yöntemi imzası durmalıdır:

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

Bir saklı codec'i parametre alır. Ancak, örnekte, bir dize sağlanır, bir kodek değildir. İkinci bir çeviri perde arkasında gerçekleşiyor: sınıfın arkadaşı nesnesi Codec bir String yöntemi uygulamak tanımlar:

def apply(encoding: String): Codec 

böylece derleyici bizim için bazı çalışmalar yapmıştır: val hatları = Source.fromFile (somefile) (Codec ("UTF-8"))

birkaç kez bu yöntemi çağıran eğer Codec örtülü olduğunu, ayrıca çağrı kapsamında bir Codec nesnesi oluşturabilir Verilen:

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

Umarım bu r ight (Ben hala bir Scala n00b, üzerinde benim sapları alıyorum - gerektiği yerde düzeltmek için çekinmeyin)

+1

Aslında, 'Codec.apply' örtük bir dönüşüm olmadığından, derleyici için sessizce bir neden yoktur Bunu aramak. Aslında burada 'Codec.string2codec' (burada ** 'String' den 'Codec 'e dolaylı bir dönüşümdür) –

4

Daniel C. eklemek içinSobral cevabı, aynı zamanda böyle bir şey deneyebilirsiniz:

val products = Source.fromFile("products.txt")("UTF-8").getLines().toList; 

for(p <- products){ 
     println("product :" + p); 
} 
0

Bu belki daha genel bir çözüm: İki ayarları ile

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

, dosyadaki hatalı biçimlendirilmiş verileri önleyebilirsiniz.

+0

Merhaba, çözümümüzü denemek istedim çünkü kabul edilen cevap benim sorun. Ancak derleyici CodingErrorAction.REPLACE değerini kabul etmediğinden derleme yapmaz. Scala.io._ dosyasını içe aktardım, hangi isim eksik? – rumtscho

+0

Bulunamadı java.nio.charset.CodingErrorAction' –