Я пытаюсь разобрать 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 inputstream? который предоставляет основное Java-решение. В Scala я могу сделать это по умолчанию, сделав кодек неявным. Я думаю, что могу сделать это по умолчанию для всего пакета, поставив его в неявное определение кодека в объекте пакета.