0

marc21 形式のファイルのレコードを分割できません。あるファイルから読み取り、レコードを別々の行に分割してから、別のファイルに書き込もうとしています。これが私が現在持っているものです:

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException{
        FileReader fr = null;
        BufferedReader br = null;
        FileWriter fw = null;
        BufferedWriter bw = null;

        try{
            fr = new FileReader("data.txt");
            br = new BufferedReader(fr);
            fw = new FileWriter("SplitRecords.txt");
            bw = new BufferedWriter(fw);

            String data;
            String recordLength = "";
            int intLength = 0;
            int lengthStart = 0;
            int lengthEnd = 5;

            while((data = br.readLine()) != null){
                while(data != null){
                    recordLength = data.substring(lengthStart, lengthEnd);
                    System.out.println(recordLength);
                    intLength = Integer.parseInt(recordLength);

                    bw.write(data, lengthStart, intLength);
                    bw.write("\n");
                    bw.flush();

                    lengthStart = intLength;
                    lengthEnd = lengthStart + 5;
                    br.mark(intLength);             
                    br.reset();
                }
            }
        }
        finally{
            if(fr != null){
                fr.close();
            }
            if(br != null){
                br.close();
            }
            if(fw != null){
                fw.close();
            }
            if(bw != null){
                bw.close();
            }
        }
    }
}

これは私が得ている出力とエラーです:

00934  
00699  
1cRT  
Exception in thread "main" java.lang.NumberFormatException: For input string: "1cRT"  
    at java.lang.NumberFormatException.forInputString(Unknown Source)  
    at java.lang.Integer.parseInt(Unknown Source)  
    at java.lang.Integer.parseInt(Unknown Source)  
    at Main.main(Main.java:26)  

最初のレコードと 2 番目のレコードをファイルに書き込みますが、3 番目のループでは長さが適切に読み取られません。なぜこれが起こっているのか誰にも分かりますか?

4

1 に答える 1

0

System.out.println出力が示すように、文字列が"1cRT"に読み込まれましたがrecordLength、これは整数 (または通常の数値) に解析できません。Integer.parseIntこのため、例外がスローされます。

入力データが期待する形式と一致するかどうかを再確認する必要があります。

編集:貼り付けた出力のソースを見ると、"1cRT"文字列として評価された に Unicode 文字があることがわかります。私はあなたが期待しているデータ形式に精通していませんが、有効な可能性の1つは、あなたが扱っている入力のチャンクrecordLength(つまり、オフセット0から5)を文字列の文字長として扱うべきではなく、代わりにバイト単位の長さとして扱うことString.substringです。文字列をバイトごとにカットします。

EDIT 2:仮定は正しいです。Marc21仕様によると、レコード長のエンコードは 5 文字の ASCII 数値文字列です。したがって、問題を修正する1つの方法は、交換することです

recordLength = data.substring(lengthStart, lengthEnd);

あり(未テスト)

recordLength = new String(Arrays.copyOfRange(data.getBytes(), lengthStart, lengthEnd), "US-ASCII");

または、FileReaders でのエンコーディングに関するこのStackOverflow の回答を参照して、ファイルの読み取りと書き込みを調整することをお勧めします。

于 2016-05-21T14:47:36.740 に答える