首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >问题拆分marc21记录

问题拆分marc21记录
EN

Stack Overflow用户
提问于 2016-05-21 22:36:13
回答 1查看 77关注 0票数 0

我在拆分marc21格式文件的记录时遇到问题。我从一个文件中读取,并尝试将记录分成单独的行,然后写入到另一个文件中。这是我目前所拥有的:

代码语言:javascript
复制
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();
            }
        }
    }
}

这是我得到的输出和错误:

代码语言:javascript
复制
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)  

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

EN

回答 1

Stack Overflow用户

发布于 2016-05-21 22:47:37

System.out.println输出所示,字符串"1cRT"被读入recordLength,它不能解析为整数(或任何正常的数字值)。由于这个原因,Integer.parseInt抛出了一个异常。

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

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

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

代码语言:javascript
复制
recordLength = data.substring(lengthStart, lengthEnd);

使用(未测试)

代码语言:javascript
复制
recordLength = new String(Arrays.copyOfRange(data.getBytes(), lengthStart, lengthEnd), "US-ASCII");

或者,您可能更喜欢参考this StackOverflow answer中有关FileReaders编码的内容,并调整文件的读取和写入。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37364253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档