程序读取ISO-2079格式MARC
http://blog.sciencenet.cn/blog-220689-473952.html
已有 3787 次阅读 2011-8-10 22:33 |个人分类:工作心得|系统分类:观点评述|关键词:MARC;ISO-2079|文章来源:转载
一、ISO-2079,即(Documentation Format for bibliographic information interchange on magnetic tape)文献信息交换用磁带格式,具有以下特点:
(1)文档目录的基本信息由一个24位固定长头标区存放,包括:文档字符长度,指示字符长度与字段标识符长度。
(2)一个字段的信息由若干个12位固定长度字符组成,包括字段标识、字段长度与字段在文档中的起始符。
(3)文档为不定量、不定字长的数据元素。 (4)以字段指示符控制字段信息。 (5)字段可重复,子字段也可重复。 二、CNMARC
CNMARC,即中国机读目录格式,它是在UNIMARC基础上,根据中文文献的特点研制的。 (1)CNMARC的记录结构与通用MARC一样含有4个部分:记录头标区、地址目录区、数据字段区与记录分隔符。
(2)CNMARC数据有5个层次,即:数据元素-子字段-字段-功能块-数据字段区。 (3)CNMARC数据字段区有10个功能块: 0-标识块 1-编码信息块 2-著录信息块 3-附注块 4-款目连接块 5-相关题名块 6-主题分析块 7-知识责任者块。 8-国际使用块 9-国内使用块
(4)CNMARC数据字段区的标识系统有3种符号组成,即:标识符,指示符与分隔符,它与通用MARC的标识符号系统一致。
(5)CNMARC有170多个字段,其中包括必备字段与选择字段,可重复字段与不重复字段,仅适用于特定文献类型的字段,CNMARC中多数字段可以在一份文档中重复出现,其001、005、010、100、101、102、105、106、123、200、205、210、215、225、300、461、500、686、701、702、711、712、801、905为必备字段。CNMARC在修订版中增加了856字段—电子文件地址与检索,为快速增长的数字化文献的描述服务。
(6)CNMARC附录有5种代码表格:文献类型标识符号、常用语言代码、GB2659常用国家和地区名代码、GB2260中华人民共和国行政区划代码、缩微中心与各拍摄馆代码。
机读目录载体信息密度高,信息量大,工作人员录入一条记录,可多次输出,可以为用户提供多种检索途径。计算机编目软件可对每条记录自动排序,节省了昔日图书馆员组织目录的大量
时间。计算机编目,目录维护方便。有了MARC,全国可以形成统一的编目机制,一条款目形成后,联网上载,全国可以共享。有了MARC,OPAC服务才能成为可能。MARC为图书馆采购,编目服务,为图书馆管理提供了极大的方便。
全球使用的MARC有多种,但其主要的字段是一致的,这为资源文档的交流与转换奠定了基础,为资源的共知,共建,共享打开了方便之门。 三、程序读取
读取marc数据实质就是解析MARC记录,根据MARC数据的特点,MARC记录的目次区是由若干个目次项组成。它的作用是进一步向计算机指示目录数据描述信息,记录所有数据字段位置的索引,包括每个数据字段的字段标识符、长度、位置和说明符,以便使计算机更方便地进行查找处理。因此首先要通过程序解析MARC记录的所有字符、字符的位置及长度;然后根据获取的字符、字符位置及长度获取每个字符的内容。
public const char FLDEND = (char)30; // 子字段结束符:@ public const char RECEND = (char)29; // 记录结束符:% public const char SUBFLD = (char)31; // 子字段开始符:$
public constint HEAD_LEN = 24;//头标区长度
private string sPath = \ private string sBakPath = \ private string sCon = \ privateDataSet ds = null;
///
private string sFLD = \ publicOPACLoading(string spath,stringsbakpath,stringscon) {
sPath = spath; sCon = scon; sBakPath = sbakpath; }
///
if (!Directory.Exists(sPath)) return;
try {
stringsLocalConstr = \
OleDbConnectionocon = new OleDbConnection(sLocalConstr); ocon.Open();
ds = new DataSet();
OleDbDataAdapteroAdapt = new OleDbDataAdapter(\OPAC_BookInfo where 1>1\
OleDbCommandBuilderocBuild = new OleDbCommandBuilder(oAdapt); oAdapt.Fill(ds, \
DirectoryInfo di = new DirectoryInfo(sPath); FileInfo[] fis = di.GetFiles(); foreach (FileInfos infis) {
//StreamReader r1 = new StreamReader(s.FullName, Encoding.Default); //string ss = r1.ReadToEnd();
FileStream fs = s.Open(FileMode.Open, FileAccess.Read); boolbRead = false; try {
if (bRead = ReadingLine(fs))//解析成功 {
if (ds.Tables[\ {
oAdapt.Update(ds.Tables[\ ds.Tables[\ } } }
catch (Exception ex) {
bRead = false;
Console.WriteLine(s.FullName); } finally {
fs.Close(); if (bRead)
File.Move(s.FullName, sBakPath + \ } }
ocon.Close(); }
catch (Exception e)
{
return; } }
///
///
private bool ReadingLine(FileStream stream) {
boolbOK = true;
try {
StreamReadersread = new StreamReader(stream,Encoding.Default);
stringsTmpLine = sread.ReadToEnd(); if (sTmpLine != null) {
if (string.IsNullOrEmpty(sTmpLine)) return false; sTmpLine = sTmpLine.Trim();
if (sTmpLine.Length< 6) return false;
string[] sRecs = sTmpLine.Split(RECEND); for (inti = 0; i if(string.IsNullOrEmpty(sRecs[i]))continue; AnalysisOPAC(sRecs[i]); } } } catch (Exception e) { bOK = false; } returnbOK; } /// /// private bool AnalysisOPAC(string sLine) { boolbOK = true; stringsMuCi = GetMC(sLine); stringsData = sLine.Substring(HEAD_LEN + sMuCi.Length).Trim(); Hashtableht = FormFld(sMuCi); bOK = FormBookInfo(ht, sData,sLine); returnbOK; } /// /// private bool FormBookInfo(Hashtableht, string sData,stringsSRC) { try { DataRowdrNew = ds.Tables[\ string[] sTmpData ; ///010字段 FldInfofiTmp = (FldInfo)ht[\ if (fiTmp != null) { sTmpData = GetString(sData, fiTmp.Star, fiTmp.Len).Split(SUBFLD); for (inti = 0; i if (sTmpData[i].StartsWith(\sTmpData[i].TrimStart('a'); if (sTmpData[i].StartsWith(\sTmpData[i].TrimStart('d'); } }