我在分割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回答,并调整文件的读取和写入。