我无法拆分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)
它将第一个记录和第二个记录写入文件,但第三个循环不能正确读取长度。有谁知道为什么会这样?
答案 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关于编码的答案,并调整文件的读取和写入。