DBからテキストを読み取って、次のようにUTF-8エンコーダーを使用してファイルを形成しています。
csvBufWr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fname), Charset.forName("UTF-8").newEncoder()), (int) buffersize);
csvBufWr.write(recordtoinsert);
csvBufWr.newLine();
次に、レコードに基づいて、シェルスクリプトを使用して、このファイルを(私が制御できない別のシステムからの)別のファイルと比較します。マージ後、Apache POI を使用して Excel シートを作成する必要があります。そこで、以下のようにファイルを読み込んでエクセルシートに書き込みます。
CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
//decoder.onMalformedInput(CodingErrorAction.IGNORE);
csvBufRdr = new BufferedReader(new InputStreamReader(new FileInputStream(pathAndFileName), decoder));
// read the file line by line, parse the record and write them
// to the XL file
while ((line = csvBufRdr.readLine()) != null) {
if (!line.isEmpty() && line.length() > 8) {
parseAndWrite2Sheet(line, sheet, workBook, sheetName);
}
}
line = csvBufRdr.readLine()
ただし、ランダムな数の行を読み取った後、MalformedInputException が発生します。読み込んでいるファイルをよく確認したところ、変な文字はないようです。例外が発生した行とその上下2行を削除しても、同じ行番号で例外が発生します。追加decoder.onMalformedInput(CodingErrorAction.IGNORE)
することで問題は解決したようですが、レコードを削除するのか、容認できないキャラクターを削除するのか、誰もが心配しています.
生成したエクセルと使用したファイルを比較したところ、違いはないようです。なぜこれが起こっているのか誰にも指摘できますか?
AFAIKがデフォルトでUTFファイルを扱い、問題を引き起こしている可能性は低いと思われるLINUXでのマージが原因です。
私は頭が痛いです!