Como ler um arquivo de texto com codificações mistas em Scala ou Java?

Eu estou tentando analisar um arquivo CSV, idealmente usando weka.core.converters.CSVLoader. No entanto, o arquivo que eu tenho não é um arquivo UTF-8 válido. É principalmente um arquivo UTF-8, mas alguns dos valores de campo estão em codificações diferentes, então não há codificação na qual o arquivo inteiro é válido, mas eu preciso analisá-lo de qualquer maneira. Além de usar bibliotecas java como Weka, estou trabalhando principalmente no Scala. Eu nem sou capaz de ler o arquivo usando scala.io.Source: Por exemplo

Source.
  fromFile(filename)("UTF-8").
  foreach(print);

lança:

    java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(CoderResult.java:277)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:337)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:176)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:153)
at java.io.BufferedReader.read(BufferedReader.java:174)
at scala.io.BufferedSource$anonfun$iterlança:$anonfun$apply$mcI$sp$1.apply$mcI$sp(BufferedSource.scala:38)
at scala.io.Codec.wrap(Codec.scala:64)
at scala.io.BufferedSource$anonfun$iter$1.apply(BufferedSource.scala:38)
at scala.io.BufferedSource$anonfun$iter$1.apply(BufferedSource.scala:38)
at scala.collection.Iterator$anon$14.next(Iterator.scala:150)
at scala.collection.Iterator$anon$25.hasNext(Iterator.scala:562)
at scala.collection.Iterator$anon$19.hasNext(Iterator.scala:400)
at scala.io.Source.hasNext(Source.scala:238)
at scala.collection.Iterator$class.foreach(Iterator.scala:772)
at scala.io.Source.foreach(Source.scala:181)

Eu estou perfeitamente feliz em jogar fora todos os personagens inválidos ou substituí-los por algum manequim. Eu vou ter lotes de texto como este para processar de várias maneiras e pode precisar passar os dados para várias bibliotecas de terceiros. Uma solução ideal seria algum tipo de configuração global que faria com que todas as bibliotecas Java de baixo nível ignorassem bytes inválidos no texto, para que eu pudesse chamar bibliotecas de terceiros nesses dados sem modificação.

SOLUÇÃO:

import java.nio.charset.CodingErrorAction
import scala.io.Codec

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

val src = Source.
  fromFile(filename).
  foreach(print)

Obrigado a + Esailija por me apontar na direção certa. Isso me levou aComo detectar seqüências de bytes UTF-8 ilegais para substituí-las no fluxo de entrada java? que fornece a solução java core. No Scala, posso fazer disso o comportamento padrão, tornando o codec implícito. Eu acho que posso torná-lo o comportamento padrão para o pacote inteiro, colocando-o na definição de codec implícito no objeto de pacote.

questionAnswers(7)

yourAnswerToTheQuestion