¿Cómo leer un archivo de texto con codificaciones mixtas en Scala o Java?

Estoy tratando de analizar un archivo CSV, idealmente utilizando weka.core.converters.CSVLoader. Sin embargo, el archivo que tengo no es un archivo UTF-8 válido. En su mayoría es un archivo UTF-8, pero algunos de los valores de campo están en diferentes codificaciones, por lo que no hay ninguna codificación en la que todo el archivo sea válido, pero necesito analizarlo de todos modos. Además de usar bibliotecas de java como Weka, estoy trabajando principalmente en Scala. Ni siquiera puedo leer el archivo usin scala.io.Source: Por ejemplo

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

tiros

    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$itertiros$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)

Estoy perfectamente feliz de tirar todos los caracteres no válidos o reemplazarlos con algún tonto. Voy a tener un montón de texto como este para procesar de varias maneras y es posible que deba pasar los datos a varias bibliotecas de terceros. Una solución ideal sería algún tipo de configuración global que haga que todas las bibliotecas java de bajo nivel ignoren los bytes no válidos en el texto, de modo que pueda llamar a bibliotecas de terceros en estos datos sin modificaciones.

SOLUCIÓN:

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)

Gracias a + Esailija por indicarme la dirección correcta. Esto me llevo a¿Cómo detectar secuencias de bytes UTF-8 ilegales para reemplazarlas en el flujo de entrada java? que proporciona la solución de Java Core. En Scala puedo hacer que este sea el comportamiento predeterminado haciendo que el códec sea implícito. Creo que puedo convertirlo en el comportamiento predeterminado de todo el paquete al colocarlo en la definición de códec implícita en el objeto del paquete.

Respuestas a la pregunta(7)

Su respuesta a la pregunta