参考来源:
[1] https://segmentfault.com/a/1190000022435622
[2] https://91marc.cn/marchelp/cnmarc1.htm
[3] https://www.cnblogs.com/SunSpring/p/17435260.html
中国机读目录(CNMARC)的格式主要是根据国际图联的UNIMARC以及我国出版物的一些特殊情况和规则的新变化而编制的。
一、解析CNMARC的符号
1.1 字段标识符
字段标识符是指用于标记字段的一组三位数字符号,也称字段号,其中第一数字用以区分不同的功能块,在同一功能块中,不同字段标识符的第一个数字均相同;不同的字段标识符表示不同内容的字段。
字段标识符位于机读目录的目次区。
例:200字段用于标识题名与责任说明项,210字段用于标识出版发行项。
1.2 字段指示符
字段指示符是用来提供有关字段内容的附加信息,记录中该字段与其他字段的相互关系或某些数据处理时所需的操作信息。
字段指示符位于书目记录中每一数据字段的前面,由两位数字或字母组成,注意每位指示符在特定字段中均有特定的含义,其含义在每个可变长字段说明中有专门规定,未定义的指示符用空格。
例:200字段是题名与责任说明项,其中指示符1是题名有无检索意义指示符,如指示符1取值为0,则题名无检索意义,若取值为1,则题名有检索意义,即可用题名检索。指示符2未定义,填空格。
1.3 子字段标识符
子字段标识符是由两个字符组成的代码,用以标识可变长字段中的不同子字段。
子字段标识符位于子字段的最前面,其中第一个字符为ISO2709中规定的专用符号,格式文本中用“$”
表示,第二个字符为字母或数字。子字段标识符从属于字段标识符,如200字段的$a
与606字段的$a
,虽然子字段的代码相同,但字段不同,所以它们的含义也不同。因此,每一个字段的子字段标识符具有专门的含义。
例:210 # # $a上海$b少年儿童出版社$d1991.5
完整的字段号参考:https://91marc.cn/marchelp/cnmarc2.htm
常用的字段号:
001 记录标识号:无指示符、子字段标识符,本字段数据为12个字符长
010 |aISBN号|b装订方式|d获得方式和/或定价|z错误的ISBN号
100 |a通用处理数据,定长36个字符
101 0 |a正文语种|b中间语种|c原作语种
102 |a出版或制作国|b出版地区
105 |a图书编码数据
106 |a文字资料代码—物理形态标志
200 1 |a正题名|b一般资料标识|c另一作者的正题名|d并列题名|e副题名及其他说明题名的文字|f第一责任者|g其它责任者|h分册(辑)号|i分册(辑)名|v卷册号标识|z并列题名语种|A正题名汉语拼音|E副题名、其他说明题名文字的汉语拼音|F第一责任者的汉语拼音|I分册(辑)名的汉语拼音
205 |a版本说明
210 |a出版、发行地|c出版、发行者名称|d出版、发行日期
215 |a类型标识和文献的数量及单位|c其它形态细节|d尺寸或开本|e附件
225 |a正丛编题名|d并列丛编题名|e丛编副题名及其它信息|f丛编责任者|h分册(辑)号|i分册(辑)题名
300 |a一般附注内容
303 |著录信息附注,无题名页时在些著录;据图书在版编目(CIP)数据著录
304 |a题名责任者附注
320 |a书目、索引附注
327 |a内容附注内容
330 |a本书内容简介
410 0|用来连接本著录实体所从属的丛编的有关数据,设子字段|1
5101 |a并列题名|z并列题名语种
6060 |a主标目|x主题复分|y地区复分|z年代复分
690 |a分类号|v版次
701 0或1 |a人名—等同责任者款目要素|b名称的其它部分(不包括款目要素)|4著作责任(采用《普通图书著录规则》10.1.5.10说明)|A款目要素汉语拼音
702 0或1 |a人名—次要责任者款目要素|b名称的其它部分(不包括款目要素)|4著作责任(采用《普通图书著录规则》10.1.5.10说明)|A款目要素汉语拼音
711 0或1 |a团体名称—等同责任者款目要素|4著作责任(采用《普通图书著录规则》10.1.5.10说明)|A款目要素汉语拼音
712 0或1 |a团体名称—次要责任者款目要素|4著作责任(采用《普通图书著录规则》10.1.5.10说明)|A款目要素汉语拼音
801 |a国家代码|b机构名称代码|c处理日期
905 |a收藏馆代码|b登录号|d分类号|e书次/种次号|f复本数|v入藏卷期|y年代范围
二、CNMARC的格式
标准下载地址:GB/T 20163-2006标准下载 GB/T 20163-2006 中国档案机读目录格式-标准下载网-www.bzxz.net
2.1 框架结构
2.2.记录头标
由24个字符构成。
根据ISO2709的规定,每一条记录由24个字符的记录头标开始,记录头标包含有ISO2709中定义的关于记录结构的数据和作为ISO2709的执行格式而由本标准专门定义的数据元。这些作为执行格式而定义的数据元是:记录类型、记录级别、记录级别关系、档案控制、著录等级、记录的完整程度以及在编制记录中是否采用 DA/T18等。记录头标中的数据元主要是为满足记录处理的需要,并间接地利用其来确认档案著录单位。
2.3 地址目次区
由三个数字型的字段标识号(简称字段号)以及字段长度和字段起始字符位置(从第一个数据字段算起)构成。
目次区的第二部分是该字段的字符数,其包括该字段的全部字符:指示符、子字段标识符、行文字符或代码数据以及字段分隔符。在字段长度之后,是字段起始字符位置,即相对于记录可变长字段部分的第一个字符位置的字段起始字符位置,第一个可变长字段的第一个字符的位置为0,0字符位置在整个记录中的位置由记录头标中第12-16位置上的数字标明。
字段标识符的长度为3个字符,数据的长度为4个字符,起始字符位的长度为5个字符。所有由12个字符所构成的目次项均对应于记录中的各个数据字段,标识目次区结束的分隔符是GB/T1988-1998中的IS2。目次区中各目次项是按字段标识符的第一个数字排序的,记录中的数据字段本身不需要排序,因为其位置完全是由目次区确定的。
3.数据字段(变长),每个字段之间由字段分隔符隔开。
有关编码格式的内容存储在100字段内,标识符$a:
三、符号约定
1.用“$”作为子字段标识的第一个符号。
2.用“# ”标示空格或本书中行文不明显而必须显现的间隔。如未定义的指示符常用“# ”标示。
四、使用pymarc开源库解析
参考:https://segmentfault.com/a/1190000022435622
# encoding: utf-8
# author: qbit
# date: 2020-04-23
# summary: CN-MARC 数据读取样例
import sys
sys.path.append('./pymarc')
import pymarc
from pymarc import MARCReader
def read_cnmarc(file):
with open(file, 'rb') as f:
line = f.readline().strip(b'\r\n')
reader = MARCReader(line, file_encoding='GBK')
for record in reader:
print(f">>> 标题: {record['200']['a']}, {record.title}")
for field in record.fields:
field: pymarc.field.Field
# print(field)
print(f"tag={field.tag}")
print(f"subfields={field.subfields}")
if __name__ == "__main__":
read_cnmarc('E:\CodeSpace\PythonTools\cnmarc.iso')
输出:
>>> 标题: 张友渔学术论著自选集, None
tag=001
subfields=[]
tag=005
subfields=[]
tag=010
subfields=[Subfield(code='b', value='平'), Subfield(code='d', value='RMB21.00')]
tag=100
subfields=[Subfield(code='a', value='19970529d1992 y0chic0121 ea')]
tag=101
subfields=[Subfield(code='a', value='chi')]
tag=105
subfields=[Subfield(code='a', value='y 000yy')]
tag=200
subfields=[Subfield(code='a', value='张友渔学术论著自选集'), Subfield(code='b', value='专著'), Subfield(code='f', value='张友渔著'), Subfield(code='A', value='zyyxslzzxj')]
tag=210
subfields=[Subfield(code='a', value='北京'), Subfield(code='b', value='北京'),
Subfield(code='c', value='北京师范大学出版社'), Subfield(code='d', value='1992.5')]
tag=215
subfields=[Subfield(code='a', value='657页'), Subfield(code='d', value='大32开')]
tag=690
subfields=[Subfield(code='a', value='D-5')]
tag=701
subfields=[Subfield(code='a', value='张友渔')]
tag=801
subfields=[Subfield(code='a', value='CN'), Subfield(code='b', value='Library'), Subfield(code='c', value='19970529'), Subfield(code='U', value='sa')]
tag=801
subfields=[Subfield(code='a', value='CN'), Subfield(code='b', value='Library'), Subfield(code='c', value='20000109'), Subfield(code='U', value='sa')]
tag=998
subfields=[Subfield(code='a', value=' '), Subfield(code='b', value='ZZ'), Subfield(code='1', value='1'), Subfield(code='2', value='1'), Subfield(code='3', value='1'), Subfield(code='4', value='1'), Subfield(code='5', value='1'), Subfield(code='6', value='1'), Subfield(code='7', value='1'), Subfield(code='8', value='1'), Subfield(code='9', value='1')]
tag=905
subfields=[Subfield(code='a', value='ZJXU'), Subfield(code='d', value='D-5'), Subfield(code='e', value='2'), Subfield(code='f', value='1')]
附:
解决python读取utf-8时出现代码\xef\xbb\xbf
https://www.cnblogs.com/libin6505/p/10819828.html