Как прочитать текстовый файл со смешанными кодировками в Scala или Java?

Я пытаюсь проанализировать файл CSV, в идеале с помощью weka.core.converters.CSVLoader. Однако файл, который я имею, не является допустимым файлом UTF-8. В основном это файл UTF-8, но некоторые значения полей находятся в разных кодировках, поэтому нет кодировки, в которой весь файл является действительным, но мне все равно нужно его проанализировать. Помимо использования библиотек Java, таких как Weka, я в основном работаю в Scala. Я даже не могу прочитать файл usin scala.io.Source: например

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

броски:

    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$iter$1$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)

Я совершенно счастлив выбросить всех недопустимых персонажей или заменить их на пустышку. У меня будет много текста, подобного этому, для обработки различными способами, и, возможно, потребуется передать данные в различные сторонние библиотеки. Идеальным решением будет какой-то глобальный параметр, который заставит все низкоуровневые библиотеки Java игнорировать недопустимые байты в тексте, чтобы я мог вызывать сторонние библиотеки для этих данных без изменений.

РЕШЕНИЕ:

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)

Спасибо + Esailija за указание в правильном направлении. Это привело меня кКак обнаружить недопустимые последовательности байтов UTF-8, чтобы заменить их во входном потоке Java? который обеспечивает основное решение Java. В Scala я могу сделать это поведением по умолчанию, сделав кодек неявным. Я думаю, что могу сделать его поведением по умолчанию для всего пакета, поместив его неявное определение кодека в объект пакета.

Ответы на вопрос(7)

Ваш ответ на вопрос