发布拆分marc21记录



我在分割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)  

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

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

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

EDIT:查看粘贴输出的源,可以看到在"1cRT"中,有一个unicode字符,计算结果为字符串。我不熟悉您所期望的数据格式,但一种有效的可能性是,您将被视为recordLength的输入块(即偏移量0到5)不应被视为String的字符长度,而是以字节为单位的长度,因为String.substring正在逐字节地切割您的字符串。

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

recordLength = data.substring(lengthStart, lengthEnd);

带有(未经测试的)

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

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

相关内容

  • 没有找到相关文章

最新更新