解析marc数据:

marc数据分为三部分:标识区、目次区、数据记录区。详情请仔细查找资料,本文不多介绍,直接上代码

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class JMarc {static Map<String, String> map=new HashMap<String, String>();//解析集合public Map<String, String> jxMarc(String marc){originalMap();String m=marc.split("\\u001D")[0];String s1=m.split("\\u001E")[0];String s2=(String) s1.subSequence(5, 6);if(s2.equals("d")){System.err.println("检测到数据已废除!错误发生在:标识区状态为‘d’");return map;}int  s3=Integer.parseInt(s1.substring(12,17));String s4=s1.substring(24,s3-1);if(s4.length()%12!=0) {System.err.println("检测到数据格式错误!错误发生在:地址目次区");return map;}List<String> list1=new ArrayList<String>();//目次区集合for(int i=0;i<s4.length()/12;i++) {list1.add( s4.substring( 12*i, 12*(i+1) ) );}int k=m.split("\\u001E").length-1;//第一个数组是标识+目次区String[] sz=m.split("\\u001E");List<String> list2=new ArrayList<String>();//记录区集合for(int i =0;i<k;i++) {list2.add(sz[i+1]);}if(list1.size()!=list2.size()) {System.err.println("检测到目次区与记录区数量不匹配!错误发生在:目次区或数据区,"+ "目次区:"+list1.size()+"组,记录区:"+list2.size()+"条");return map;}//匹配for(int i=0;i<list1.size();i++) {matchingMap(list1.get(i).substring(0,3),list2.get(i));}return map;}//初始化mappublic Map<String, String> originalMap() {map.put("isbn", null);//ISBNmap.put("title", null);//标题map.put("divisionname", null);//分册名map.put("divisionnumber", null);//分册号map.put("author", null);//作者map.put("oneprice", null);//价格map.put("size", null);//尺寸map.put("page", null);//页数、x册map.put("published", null);//出版地map.put("clc", null);//中图分类号map.put("press", null);//出版社map.put("pubdate", null);//出版时间map.put("language", null);//语言map.put("type", null);//主题map.put("Remarks", null);//内容、简介return map;}//匹配并赋值mappublic void matchingMap(String key1,String key2) {switch (key1) {case "010":if( key2.split("\\u001Fa").length>1 ) {//isbnString f1=key2.split("\\u001Fa")[1];String f2=f1.split("\\u001F")[0];map.put("isbn", f2);}if(key2.split("\\u001Fd").length>1) {//价格String f1=key2.split("\\u001Fd")[1];String f2=f1.split("\\u001F")[0];map.put("oneprice", f2);}break;case "101":if(key2.split("\\u001Fa").length>1) {//语言String f1=key2.split("\\u001Fa")[1];String f2=f1.split("\\u001F")[0];map.put("language", f2);}break;case "200":if(key2.split("\\u001Ff").length>1) {//作者String f1=key2.split("\\u001Ff")[1];String f2=f1.split("\\u001F")[0];map.put("author", f2);}if(key2.split("\\u001Fa").length>1) {//题名String f1=key2.split("\\u001Fa")[1];String f2=f1.split("\\u001F")[0];map.put("title", f2);}if(key2.split("\\u001Fh").length>1) {//分册号***可能不止一个'@h'String f1=key2.split("\\u001Fh")[1];String f2=f1.split("\\u001F")[0];map.put("divisionnumber", f2);}if(key2.split("\\u001Fi").length>1) {//分册名***可能不止一个'@i'String f1=key2.split("\\u001Fi")[1];String f2=f1.split("\\u001F")[0];map.put("divisionname", f2);}break;case "210":if(key2.split("\\u001Fa").length>1) {//出版地String f1=key2.split("\\u001Fa")[1];String f2=f1.split("\\u001F")[0];map.put("published", f2);}if(key2.split("\\u001Fc").length>1) {//出版社String f1=key2.split("\\u001Fc")[1];String f2=f1.split("\\u001F")[0];map.put("press", f2);}if(key2.split("\\u001Fd").length>1) {//出版时间String f1=key2.split("\\u001Fd")[1];String f2=f1.split("\\u001F")[0];map.put("pubdate",f2);}break;case "215":if(key2.split("\\u001Fd").length>1) {//尺寸String f1=key2.split("\\u001Fd")[1];String f2=f1.split("\\u001F")[0];map.put("size", f2);}if(key2.split("\\u001Fa").length>1) {//页数***可能是层数String f1=key2.split("\\u001Fa")[1];String f2=f1.split("\\u001F")[0];map.put("page", f2);}break;case "330":if(key2.split("\\u001Fa").length>1) {//内容String f1=key2.split("\\u001Fa")[1];String f2=f1.split("\\u001F")[0];map.put("Remarks", f2);}break;case "606":   if(key2.split("\\u001Fa").length>1) {//主题String f1=key2.split("\\u001Fa")[1];String f2=f1.split("\\u001F")[0];map.put("type", f2);}break;case "690":if(key2.split("\\u001Fa").length>1) {//分类号String f1=key2.split("\\u001Fa")[1];String f2=f1.split("\\u001F")[0];map.put("clc", f2);}break;default:break;}}}

将结果放到了map数组里。解析的数据都是规定好的,因为这是本人项目的一小部分,需要其他部分解析的可以参考资料添加解析。匹配类是单独的

拼接marc数据

会解析自然会拼接拉。直接上代码了。自己看吧:

public class PMarc {String marc1 = null;//第一段标识String marc2 = null;//第二段目次String marc3 = null;//第三段记录String marc =null;//marc数据char _RecordSplitChar = '\u001D';  // 区间分隔符char _FieldSplitChar = '\u001E';  // 字段分割符char _SubFieldSplitChar = '\u001F';  // 子字段分隔符public String pjMarc(String isbn,String oneprice,String title,String author,String press,String clc) {//记录区String s1="  "+_SubFieldSplitChar+"a"+isbn+_SubFieldSplitChar+"d"+oneprice;    //010  isbn+价格String s2=_FieldSplitChar+"1 "+_SubFieldSplitChar+"a"+title+_SubFieldSplitChar+"f"+author;   //200 题名+作者String s3=_FieldSplitChar+"  "+_SubFieldSplitChar+"c"+press;     //210 出版社String s4=_FieldSplitChar+"  "+_SubFieldSplitChar+"a"+clc ;    //690 中图分类号marc3=s1+s2+s3+s4;marc2="010"+String.format("%04d", s1.length())+String.format("%05d", 0)+"200"+String.format("%04d", s2.length())+String.format("%05d", 0+s1.length())+"210"+String.format("%04d", s3.length())+String.format("%05d", 0+s1.length()+s2.length())+"690"+String.format("%04d", s4.length())+String.format("%05d", 0+s1.length()+s2.length()+s3.length());marc1=String.format("%05d", marc3.length()+marc2.length()+1)+"pam0"+" 22"+String.format("%05d",marc2.length()+1+24)+"   "+"450 ";marc=marc1+marc2+_FieldSplitChar+marc3+_RecordSplitChar;return marc;}
}

拼接类拼接的比较简单,可以自行添加复杂,注意的是分隔符,很容易出错。

测试类

import java.util.HashMap;
import java.util.Map;public class test {public static void main(String[] args) {Map<String, String> map=new HashMap<String, String>();JMarc j=new JMarc();PMarc p=new PMarc();//拼接String s=p.pjMarc("978-7-5463-4025-4", "CNY79.50", "诛仙", "萧鼎著", "起点小说网", "D67.475");map=j.jxMarc(s);//解析测试System.err.println(s);System.out.println(map);//解析String s2="01141nam0 2200289   450 00100100000000500170001001000390002703500260006603500240009204900490011610000410016510100080020610200150021410500180022910600060024720001570025321000350041021500190044533001600046460700250062469000140064970100490066370200310071271200630074380100220080680100230082800011310320020928000000.0  a7-101-00183-1dCNY332.00(全二十册)  a(A100000NLC)000113139  a(011001)c2001044106  aA100000NLCbUCS01000113103c000113139dNLC01  a20010709e19951956em y0chiy0110    ea0 achi  aCNb110000  ay   z   000yy  ar1 a资治通鉴9zi zhi tong jianh第一册i卷一至一十二 周威烈王二十三年戊寅起 汉惠帝七年癸丑止b专著f(宋)司马光编著g(元)胡三省音注g“标点资治通鉴小组”校点  a北京c中华书局d1956h1995重印  a75,418页d20cm  a《资治通鉴》为北宋司马光所编撰的编年体通史,共294卷。全书记载了上起周威王二十三年(公元前403年),下至五代周世宗显德六年(公元959年)的一千三百六十二年的历史。  a中国x古代史j编年体  aK204.3v4 0c(宋)a司马光f(1019-1086)9si ma guang4编著 0a胡三省9hu san sheng4音注02a标点资治通鉴小组9biao dian zi zhi tong jian xiao zu4校点 0aCNbNLCc20010717 2aCNbOLCCc20100923";map=j.jxMarc(s2);System.out.println(map);}
}

s2字符串中的marc数据乱码了。编码格式不同,建议自己去找一条marc数据去测试,可以去:中国国家图书馆找。
还有关于用z39.50协议套取mar数据的java方法可以去看我的另一篇yaz4j获取marc数据
套取marc方法类下载
-------------------------------------------------2019-11-01记载日志

Marc数据解析和拼接(java版)相关推荐

  1. Java秘技之Json数据解析与转换 -- Java使用示例

    概要 json是前后台交互常用的数据格式,在java后台中经常需要实现java bean.list和json字符串的相互转化,故简单介绍不同框架的使用,提供简单工具类. 在Java中,常见的json框 ...

  2. 将CSV的数据发送到kafka(java版)

    为什么将CSV的数据发到kafka flink做流式计算时,选用kafka消息作为数据源是常用手段,因此在学习和开发flink过程中,也会将数据集文件中的记录发送到kafka,来模拟不间断数据: 整个 ...

  3. 通过z39.50协议用YAZ软件获取Marc数据(JAVA版)

    通过z39.50协议用YAZ软件获取Marc数据(JAVA版) 目前网上没有找到相关正式可用的例子,于是自己花了一星期去看文档和前人写的例子(都是10多年前的帖子和资源),分享给大家,希望后来的和我一 ...

  4. 深入解析棋牌湖南放炮罚,跑胡子手游源码(java版)

    深入解析棋牌湖南放炮罚,跑胡子手游后台源码(java版) 最近开发了一款湖南放炮罚的房卡模式带三级分销的手游,现在我就将我开发中的思路给朋友们分享一下. 首先介绍一下棋牌游戏最近的火热度吧. 最近微信 ...

  5. Java算法:牛客网Java版剑指Offer全套算法面试题目整理及电子档,Java算法与数据结构面试题,面试刷题、背题必备!牛客网剑指offer

    剑指offer(java版) 牛客网Java版剑指Offer全套题目67道 资源来源于网络 目录 1.二维数组中的查找 2.替换空格 3.从尾到头打印链表 4.重建二叉树 5.用两个栈实现队列 6.旋 ...

  6. 海关跨境电商进口统一版信息化系统平台数据实时获取接口(试行) java版

    海关跨境电商进口统一版信息化系统平台数据实时获取接口(试行) java版 海关总署公告: http://www.customs.gov.cn/customs/302249/302266/302267/ ...

  7. java数组里套数组_用JAVA进行Json数据解析(对象数组的相互嵌套)

    这段时间我们在做一个英语翻译软件的小小小APP,涉及到了对Json数据的解析,所以特地来总结一下! 假设我们要对如下数据进行解析,其实在平时,返回的Json数据是很乱的,很难分清数据的关系,这是经过相 ...

  8. Modbus通信协议+Modbus串口调试工具+Java版协议解析源码

    网络与串口二合一调试助手TCPCOM: https://download.csdn.net/download/liuyuan_java/87454762 Modbus调试工具,模拟串口调试工具 htt ...

  9. java版银联8583协议解析,超简单超直观的实现及示例(全互联网最简单)

    一直以来做嵌入式软件开发,跟银联8583协议通信打交道太多了. 最近有需要把8383协议的解析用到android上,但是搜遍了整个互联网,没发现有哪个简单好用点的java版8583解析库.就自己动手自 ...

最新文章

  1. wxwidgets mysql_wxWidgets导入Excel文件详细教程
  2. vn.py 2.0.2 发布,全功能交易程序开发框架
  3. iterm2 mac链接linux工具 桌面程序Transmit
  4. 基础篇-verilog-按位与和逻辑与
  5. linux和python的关系_Python、Linux与我的缘分
  6. 标志寄存器_访问标志寄存器,并与寄存器B |交换标志寄存器F的内容 8085微处理器...
  7. Json学习总结(2)——Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP
  8. java并发编程(6)--CAS会导致“ABA问题“ 解决方案
  9. android开机动画修改实战(bootanimation)
  10. MaxScript与外部程序通讯
  11. 技术人的未来(一)——跳槽
  12. iphone换android手机铃声,在iPhone中换个自定义铃声的11个步骤
  13. ios开发调用系统相机(照片/视频)
  14. android串口开发!一年后斩获腾讯T3,附面试题答案
  15. 2017年第26届上海国际连锁加盟展览会会刊(参展商名录)
  16. C#生成COM组件,Delphi调用
  17. Excel查找重复行
  18. GAMMA初学笔记三
  19. 人工智能-深度学习Tensorflow2.0-python
  20. quickbooks php 开发,通过odbc与PHP连接到quickbooks数据库?

热门文章

  1. 《Unity3d实战就业路线》
  2. 7-5 sdust-Java-学生成绩读取与排序 (22分)
  3. 命令执行原理和利用知识点
  4. Springboot整支付宝网站支付、APP支付、单笔转账给用户、退款功能
  5. 图片工具GraphicsMagick的下载安装配置使用
  6. 海康威视监控摄像头大华摄像头webrtc监控低时延无插件直播页面播放毫无延迟
  7. 思考题:一条信息可通过如图所示的网络线由上(A点)往下向各站点传送,例如信息到达b2点可由经a1的站点送达,也可以由经a2的站点送达,共有两条途径传送,那么信息由A点到达d3的不同途径共有多少条
  8. C语言 实现长整数的相加
  9. 分数化成有限小数的方法_小数化成分数的方法
  10. 汉印HPRT HN-3208SR 驱动