Проблема расщепления записей 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)
Он записывает в первую и вторую записи в файл, однако третий цикл неправильно считывает длину. У кого-нибудь есть идеи, почему это происходит?
1 ответ
Как System.out.println
вывод показывает, строка "1cRT"
был прочитан в recordLength
, который не разбирается в целое число (или любое обычное числовое значение). Integer.parseInt
выбрасывает исключение из-за этого.
Вам следует дважды проверить, соответствуют ли ваши входные данные ожидаемому формату.
РЕДАКТИРОВАТЬ: Глядя на источник вашего вставленного вывода можно увидеть, что есть, в "1cRT"
, оценивается как строка, символ Юникода. Я не знаком с форматом данных, который вы ожидаете, но одна действительная возможность состоит в том, что часть ввода вы рассматриваете как recordLength
(т.е. смещения от 0 до 5) не должны рассматриваться как длина символов строки, а вместо этого длина в байтах, как String.substring
разрезает вашу строку байт за байтом.
РЕДАКТИРОВАТЬ 2: предположение правильно. Согласно спецификации Marc21 кодирование длины записи представляет собой пятисимвольную цифровую строку ASCII. Поэтому одним из способов исправления проблемы будет замена
recordLength = data.substring(lengthStart, lengthEnd);
с (не проверено)
recordLength = new String(Arrays.copyOfRange(data.getBytes(), lengthStart, lengthEnd), "US-ASCII");
В качестве альтернативы вы можете обратиться к этому ответу Stackru о кодировке в FileReaders и настроить чтение и запись файлов.