发出拆分marc21记录的问题

时间:2016-05-21 14:36:13

标签: java marc

我无法拆分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)  

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

recordLength = data.substring(lengthStart, lengthEnd);

with(未经测试)

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

或者,您可能更愿意在FileReaders中引用Marc21 specification StackOverflow关于编码的答案,并调整文件的读取和写入。