理想的には weka.core.converters.CSVLoader を使用して、CSV ファイルを解析しようとしています。しかし、私が持っているファイルは有効な UTF-8 ファイルではありません。ほとんどがUTF-8ファイルですが、フィールド値の一部は異なるエンコーディングであるため、ファイル全体が有効なエンコーディングはありませんが、とにかく解析する必要があります. Weka などの Java ライブラリを使用する以外は、主に Scala で作業しています。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 では、コーデックを暗黙的にすることで、これをデフォルトの動作にすることができます。パッケージ オブジェクトに暗黙的なコーデック定義を配置することで、パッケージ全体の既定の動作にすることができると思います。