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)  

它将第一条记录和第二条记录写入文件,但是第三个循环没有正确读取长度。有谁知道为什么会这样?

4

1 回答 1

0

System.out.println输出所示,一个字符串"1cRT"被读入recordLength,它不可解析为整数(或任何正常数值)。Integer.parseInt因此抛出异常。

您应该仔细检查您的输入数据是否与您期望的格式匹配。

编辑:查看粘贴输出的来源可以看到,在 中,有"1cRT"一个 unicode 字符,被评估为字符串。我不熟悉您期望的数据格式,但一种有效的可能性是您正在处理的输入块recordLength(即偏移量 0 到 5)不应被视为字符串的字符长度,而是以字节为单位的长度,String.substring原样逐字节切割你的字符串。

编辑2:假设是正确的。根据Marc21 规范,记录长度的编码是五个字符的 ASCII 数字字符串。因此,纠正问题的一种方法是更换

recordLength = data.substring(lengthStart, lengthEnd);

与(未经测试)

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

或者,您可能更喜欢参考这个StackOverflow 关于 FileReaders 中编码的答案并调整文件的读取和写入。

于 2016-05-21T14:47:36.740 回答