0

不正な文字 (バイナリ マーカー) を含むテキスト ファイルの解析に問題があります。答えは次のようなものになります。

test.csv

^000000^id1,text1,text2,text3

^000000^は、ソース ファイル内の不正な文字のテキスト表現です。

処理する前に、java.nio を使用して行を検証することを考えていました。そこで、次のように Validator トレイトを導入することを考えていました。

import java.nio.charset._
trait Validator{
   private def encoder = Charset.forName("UTF-8").newEncoder
   def isValidEncoding(line:String):Boolean = {
     encoder.canEncode(line)
   }
}

これが状況を処理するための正しいアプローチだと思いますか?

ありがとう

4

2 に答える 2

2

バイナリ データは文字列ではありません。への変換時に不正となる入力シーケンスをハッキングしようとしないでくださいString

入力が任意のバイト シーケンスである場合 (それらの多くが ASCII に準拠している場合でも)、. に変換しようとさえしないでくださいString

于 2013-04-05T19:40:24.960 に答える
2

StringUTF-8 はいつでも任意の文字列をエンコードできます* 。最初にファイルをデコードしているポイントに移動する必要があります。


ISO-8859-1 は、興味深い特性を持つエンコーディングです。

  • 文字通り、すべてのバイト シーケンスが有効です ISO-8859-1
  • デコードされた各文字のコード ポイントは、デコード元のバイトの値とまったく同じです。

したがって、ファイルを ISO-8859-1 としてデコードし、英語以外の文字を削除するだけです。

//Pseudo code
str = file.decode("ISO-8859-1");
str = str.replace( "[\u0000-\u0019\u007F-\u00FF]", "");

行ごとに反復し、 の文字を含む各行を無視することもでき[\u0000-\u0019\u007F-\u00FF]ます。それが、行を処理する前に検証するという意味であればです。


また、バイナリ マーカーが BOM である可能性があることも頭に浮かびました。16 進エディタを使用して値を表示できます。

*おそらくここでは当てはまらない違法な代理人を持つものを除いて.

于 2013-04-06T09:47:31.940 に答える