Проблема расщепления записей 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 и настроить чтение и запись файлов.

Другие вопросы по тегам