首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Marc4J计算数据的记录长度和基址

Marc4J计算数据的记录长度和基址
EN

Stack Overflow用户
提问于 2022-03-17 15:46:50
回答 1查看 30关注 0票数 -1

我正在使用Unimarc,使用marc4j库。在我的系统中,我已经能够获得org.marc4j.marc.Record的一个实例。现在,我很难弄清楚如何计算数据的记录长度和基地址。在唱片领队中使用。

我一直试图找出如何使用marc4j库或外部库来完成这个任务,但到目前为止还没有找到。

我怎样才能得到这两条信息?

EN

回答 1

Stack Overflow用户

发布于 2022-03-21 14:57:20

我在文档中找不到任何东西,但我设法做到了。职能如下:

代码语言:javascript
复制
public String getISO2709 (org.marc4j.marc.Record record ){
    OutputStream output = new OutputStream() {
        private StringBuilder string = new StringBuilder();

        @Override
        public void write(int b) throws IOException {
            this.string.append((char) b );
        }

        public String toString() {
            return this.string.toString();
        }
    };
    MarcStreamWriter writer = new MarcStreamWriter(output);
    writer.write(record);
    return output.toString();
}


public String getNoticeLength(org.marc4j.marc.Record record, org.marc4j.marc.Leader currentLeader){

    int recordLength = this.getISO2709(record).length();

    String ret = StringUtils.padLeft(String.valueOf(recordLength), '0', 5);
    if(ret.length() > 5) ret ="00000"; // since the header has space for only 5 chars, this 00000 will indicate the length was invalid

    return ret;
}

public  String getBaseAddressOfData(org.marc4j.marc.Record record, org.marc4j.marc.Leader currentLeader){

    String iso2709 = this.getISO2709(record);
    StringBuilder sb = new StringBuilder();

    for (ControlField cf : record.getControlFields()) {
        sb.append(cf.getData() + "\u001E"); // this is the character that separates the values for the control fields iso2709
    }

    int index = iso2709.indexOf(sb.toString());

    String ret = StringUtils.padLeft(String.valueOf(index), '0', 5);
    if(ret.length() > 5) ret="00000";

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

https://stackoverflow.com/questions/71515268

复制
相关文章

相似问题

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