admin 管理员组

文章数量: 1184232


2024年3月12日发(作者:php下载网站的模板)

第30卷第5期玉林师范学院学报(自然科学)Vol.30No.5

2009年JOURNALOFYULINNORMALUNIVERSITY(NaturalScience)

基于

Delphi7

SQLSERVER2000

MARC

转换设计与实现

□桑开勇

1

,苏翠红

2

(1.玉林师范学院图书馆馆员,广西玉林537000)

(2.玉林师范学院教务处工程师,广西玉林537000)

【摘要】

针对广泛使于图书馆系统中的MARC格式的书目数据,分析了MARC的数据结构,

通过Delphi7成功的把MARC数据导入到SQLSEVER2000数据库中,使得缺乏开放性MARC数据转变

成开放的数据库格式,为WEB开发和转化成其他数据格式提供成为可能.

【关键词】

图书馆;MARC;SQLSERVER2000

【中图分类号】TP311.32【文献标识码】A【文章编号】

1004-4671(2009)05-0111-03

TheDesign

Based

and

on

Realization

Delphi7and

ofMARC

SQLServer

Format

2000

Transfer

SANGKai-yong

1

,SUCui-hong

2

(ian,Library,YulinNormalUniversity,Yulin,Guangxi537000)

(er,hingAdministration,YulinNormalUniversity,

Yulin,Guangxi537000)

Abstract:InconsiderationofthebibliographicdatawithMARCformappliedinthe

librarysystemwidely,thisarticleanalyzesthestructureofMARCdata,leadsMARCdata

sMARCdatabecome

anopendatabaseformat,thusmakingitpossibletoexploitWEBandtobetransformed

intootherdataformat.

Keywords:library;MARC;SQLServer2000

M

ARC(MachineReadableCatalog机器可读范围的信息挖掘、转换,也难以与其他领域的数据

目录),它作为目前国际上普遍采用的书格式或数据处理系统互操作.本文仅就如何借助于

目数据格式,在各图书馆管理系统中现已Delphi和SQLSERVER2000系统开发环境,实现对

被普遍采用,促进了图书馆书目数据的规范化、统MARC记录任意字段进行读以及转化成其它数据格

一化.但MARC严重缺乏开放性,各类信息在具体式作一些探讨.

系统条件限制下用专门但由于每条书目的全部信息

都反映在一条MARC记录中,语言定义并组织为内

一、MARC格式分析

部结构和格式,难以有效进行机器支持的检索、处机读MARC格式是GB/T2901(ISO2709)的

理和交换,难以进行跨文献单元、数据类型和系统一个特定形式,它对每个用于交换的书目记录规定

2009年玉林师范学院学报

第5期

了必须遵循的标准记录结构

[1]

.其标准构成为:

a)记录头标:由24个字符构成.

b)地址目次区:区内含有一个或多个目次

项,每一个目次由三位数字的字段标识符(简称字

段号)以及字段长度和字段起始位置(从第一个数

据字段算起)三部分构成.

c)数据字段区:由若干定长和变长字段构

成,每个字段之间由字段分隔符隔开.

d)记录结束符:用以标识记录结束和与下一

个记录的区分.

记录结构图如表1:

表1MARC数据格式

记录头标地址目次区数据字段区记录结束符

记录头标:位于MARC记录的首部,其长度均

为24个字符.其中,第0-4位字符指示MARC记录的

长度,第12-16位指示MARC记录数据起始地址.

地址目次区:紧跟记录头标区之后.由若干目次项

组成,每个目次项固定为12个字符长,描述的是一

个字段,由三个部分组成:字段标识符(三位数

字)、字段长度(四位数字)、字段的起始字符位

置(五位数字).除此之外,不允许有其他字符.在

地址目次区之后用字段分隔符IS2(GB1988(ISO

646)的1/14)结束.地址目次区结构如表2

表2地址目次区结构

字段号

字段起始字

(3位)

长度符位置……

字段

(4位)(5位)

分隔符

地址目次区目次项1目次项2其他目次项

数据字段区:除001和005字段由数据和一个

字段分隔符组成外,每个字段(00-字段除外)仅

由两个指示符以及其后的一个或多个子字段组成.

字段中最后一个子字段的结尾为字段分隔符(GB

1988(ISO646)的IS2).每个子字段的开头为子

字段标识符,即一位字段分隔符(GB1988(ISO

646)的IS1)和一位子字段代码(字母或数字构

成).在子字段标识符之后是代码数据或正文数据.

(如表3,表4)

表3数据(控制)字段(00—)结构

数据字段分隔符

表4变长字段(010至999结构)

指示符1指示符2$a数据……字段分隔符

指示符子字段子字段其他子

标识数据字段

二、算法设计与实现

1、数据库的建立.在administrator用户,启动

SQLSERVER2000的企业管理器,创建一数据库,

在新创建数据库再创建sqlmarc的表.为了方便对各

个字段的理解,以及SQL2000表中列的命名规则,

把010b列取名为b010(如图1)

图1sqlmarc表字段图

2、MARC数据导入到SQLSERVER2000数

据库过程,实质上就是解析MARC记录,从中提

取所需的MARC对象,并记录的形式添加到SQL

SERVER2000数据库中,从而生成数据的方框图如

图2

读取Marc文件

分别读取Marc文件的每一行,直至文件结束语

读取记录标

读取地址目次区

判断是何字段

TF

判断是何子字段

TF

读取数据字

段区数据

追加到SQL

2000表中

图2程序方框图

现在以读取010国际标准书号字段中的$a国标

标准书号和$d获得方式和/或价格为例部份核心代码.

ethen

begin

桑开勇,苏翠红基于Delphi7和SQLSERVER2000的MARC转换设计与实现

datapath:=me;//打开

Marc数据文件

Filepath:=ExtractFileName(datapath);

:=filepath;

assignfile(Marc_file,datapath);

reset(Marc_file);

try

whilenotEof(Marc_file)do

begin

readln(Marc_file,Marc_rec);//分别读取

Marc数据文件中每条记录.

val(copy(Marc_rec,1,5),strnum,j);//从记

录头标中读取本记录长度.

str1:=copy(s,1,5);

strnum1:=length(Marc_rec);//计算本

记录的长度.

ifstrnum=strnum1then//判断本记录是否完整.

begin

val(copy(Marc_rec,13,5),strnum,j);//读

取记录头标中的数据基地址

strnum4:=((strnum-24-1)div12);

//计算本记录一共有多少字段.

fori:=1tostrnum4do

begin

val(copy(Marc_rec,24+(i-1)*12+4,4),

strnum2,j);//分别取出每个字段长度.

val(copy(Marc_rec,32+(i-1)*12,5),

strnum3,j);//分别取出每个字段起始字符位置

/*ifcopy(Marc_rec,25+(i-1)*12,3)='010'then

//判断该字段是否是010字段

begin

s1:=copy(Marc_rec,strnum+strnum3,strn

um2);//取010字段;

s2:=copy(s1,4,1);//取子字段起始标识

s3:=s2+'a';//取$a标识符;

num1:=pos(s3,s1);//取010$a的起始位置

field1:=copy(s1,num1+2,length(s1));

num2:=pos(s2,field1);//获是010$a

子字段的长度.

【参考文献】

[1]国家图书馆编.新版中国机读目录格式使用手册[M].北京:

北京图书馆出版社2004年3月第1版.

[2]高峰.MARC数据转换为XML文档的设计与实现[J].现代

图书情报技术:2005.(1):22-25.

[3]陈凤岩,王菁.基于XML的MARC系统转换设计与实现[J.]

ifnum2>0then

field1:=copy(field1,1,num2-1)

//获取010$a子字段内容

else

field1:=copy(field1,1,length(field1));

s3:=s2+'d';//取$d标识符

num1:=pos(s3,s1);//取010$d的起始位置

field6:=copy(s1,num1+2,length(s1));

num2:=pos(s2,field6);

//获是010$d子字段的长度

ifnum2>0then

field6:=copy(field6,1,num2-1)

//取010$d子字段内容

else

field6:=copy(field6,1,length(field6));*/

end;

从以上代码中,如要多选几个字段,只需复制

/*……*/之间的代码放在“*/”的下一行并把黑体

字部分改成相对应的字段和子字段即可.把已获取

的子字段内容存在变量中,用insertinto表名(字

段1,字段2,……,字段n)Values(变量1,变量

2,……,变量n)命令插入SQL2000中的表中.

当Marc数据导入到SQL2000后,可以用2条简

单的命令导出为常用的Excel和DBF格式.

导出Excel格式关键的语句为

tionString:='Provider=Mi

.4.0;DataSource=+’文件名’+';

ExtendedProperties=Excel8.0;PersistSecurity

Info=False';

导出DBF格式关键的语句为

tionString:='Provider=Mi

.4.0;DataSource='+’文件名’

+';ExtendedProperties=dBase5.0;PersistSecurity

Info=False';

三、结语

本文提供的代码在Delphi7和SQLSERVER

2000都能实现,此方法在我馆的原图书荐购系统中

得到应用.■

情报学报:2003.22(6).:671-675.

[4]康祥顺,张小刚等编著.Delphi案例开发集锦[M].北京:电

子工业出版社:2005.8.

【收稿日期2009-04-21】

【责任编辑谢文海】


本文标签: 记录 字段 数据