4

次の形式の 1000 行のテキスト ファイルがあります。

19 x 75 Bullnose Architrave/Skirting £1.02 

ファイルを 1 行ずつ読み取るメソッドを作成しています - これは問題なく動作します。

ArrayList<String>次に、「£」を区切り記号として使用して各文字列を分割し、次の形式で文字列に書き出します。

19 x 75 Bullnose Architrave/Skirting, Metre, 1.02

これは私がそれにアプローチした方法です(productListArrayList、tryブロックの外側で宣言/インスタンス化されています):

try{
    br = new BufferedReader(new FileReader(aFile));
    String inputLine = br.readLine();
    String delim = "£";

    while (inputLine != null){
        String[]halved = inputLine.split(delim, 2);
        String lineOut = halved[0] + ", Metre, " + halved[1];//Array out of bounds
        productList.add(lineOut);

        inputLine = br.readLine();
    }
}

文字列が分割されておらず、ArrayIndexOutOfBoundsException. 私は正規表現にあまり詳しくありません。私も古いものを使用してみましStringTokenizerたが、同じ結果が得られます。

デリムとしての問題はあり£ますか、それとも何か他のものですか? String2番目のトークンが?として読み取られないことに関係があるのではないかと思いました。

どんなアイデアでも役に立ちます。

4

3 に答える 3

6

考えられる原因のいくつかを次に示します。

  • ファイルのエンコーディングが読み取りに使用しているエンコーディングと一致せず、ファイル内の「シャープ」文字が別のものに「マングル」されています。

  • ファイルとソース コードで、異なるポンドのような文字が使用されています。たとえば、Unicode には、「ポンド記号」のように見える 2 つのコード ポイントがあります。スターリング文字 (00A3) とリラ文字 (2084) です。次に、ローマ字のセマンシア文字 (10192) があります。

  • UTF-8 でエンコードされていることをコンパイラに通知せずに、UTF-8 でエンコードされたソース ファイルをコンパイルしようとしています。


あなたのコメントから判断すると、これはエンコーディングの不一致の問題です。つまり、Java で使用されている「デフォルト」のエンコーディングは、ファイルの実際のエンコーディングと一致しません。これに対処するには、次の 2 つの方法があります。

  • ファイルのエンコーディングを変更して、Java のデフォルトのエンコーディングに一致させます。あなたはそれを試みて失敗したようです。(そして、それは私がこれを行う方法ではないでしょう...)

  • 特定の (デフォルトではない) エンコーディングでファイルを開くようにプログラムを変更します。例: 変更

    new FileReader(aFile)
    

    new FileReader(aFile, encoding)
    

    encoding、ファイルの実際の文字エンコーディングの名前です。Java で認識されるエンコーディングの名前はここにリストされていますが、私の推測では、「ISO-8859-1」(別名 Latin-1) です。

于 2012-12-20T10:24:29.403 に答える
0

これはおそらくエンコードの不一致のケースです。これを確認するには、

  • 印刷delim.lengthして、 であることを確認します1
  • 印刷inputLine.lengthして、正しい値であることを確認してください ( 42)。

それらのいずれかが期待値でない場合は、どこでも UTF-8 を使用していることを確認する必要があります。

あなたdelim.lengthは1だと言うので、これでいいです。一方、inputLine.lengthが 34 の場合、これは非常に間違っています。"19 x 75 Bullnose Architrave/Skirting £1.02"すべてが期待どおりであれば、42 を取得する必要があります。ファイルが UTF-8 でエンコードされていて、ISO-8859-1 または同様の形式で読み取られた場合、43 になります。

今、私は少し途方に暮れています。これをデバッグするには、文字列の各文字を個別に出力して、何が問題なのかを確認できます。

for (int i = 0; i < inputLine.length; i++)
    System.err.println("debug: " + i + ": " + inputLine.charAt(i) + " (" + inputLine.codePointAt(i) + ")");
于 2012-12-20T10:20:53.937 に答える
-1

すべての返信に感謝します。

読み取り内でエンコーディングを指定し、元のテキストファイルをUTF-8として保存すると機能します。

ただし、この経験から、「£」または実際には異なるエンコーディングで複数の表現を持つ可能性のある他の文字を使用してテキストを区切ることは不適切な戦略であることがわかりました。

私は別のアプローチを取ることにしました:

1)入力文字列の最後のスペースを見つけて、「xxx」などに置き換えます。

2)区切り文字「xxx」を使用してこれを分割します。文字列を分割して「£」を削除する必要があります。

3)続けて..

于 2012-12-20T23:12:13.073 に答える