MARC格式的分析 处理 转换及在VB中的实现

     由于我们的作业马上就要交了,然而网上的求助信息却没有一个人给我答案,所以自己不得不硬着头皮想了。通过翻阅资料以及自己的努力,我的MARC处理程序总算是有结果了,为了让与我有同样问题的人能够快速的解决,我决定把自己的心得与大家一起分享!下面就是一条Marc记录:
00931nam0 2200253   450 0010010000000050017000100100028000271000041000551010008000961020015001
0410500180011910600060013720001550014321000310029821500160032933001750
03456060047005206060013005676060013005806060009005936900014006027110
03900616801002200655a7-115-08909-4dCNY15.00  a20030821d2003    em y0chiy0110    ea0 achi  aCNb110000  ay   z   000yy  ar1 a高职高专院校人才培养工作水平评估资料汇编9gao zhi gao zhuan yuan xiao ren cai pei yang gong zuo shui ping ping gu zi liao hui bianf教育部高等教育司编  a北京c人民邮电出版社d2003  a244页d20cm  a本书内容大体可分为五部分:国家、教育部关于高职高专教育改革、发展以及就业等方面的重要法规和文件;教育部有关领导讲话;高职高专院校人才培养工作水平评估系列文件及评估方案等。0 a高等教育x职业教育x人才x培养x评估y中国0 a高等教育0 a职业教育0 a人才  aG718.5v402a教育部9jiao yu bub高等教育司4编 0aCNbNLCc20031107

一、Marc数据格式介绍:
    我们对Marc记录进行一些简单的介绍。它是一种专供计算机程序识别的机读目录。为便于计算机去识别和处理 ,MARC记录必须按一定格式进行存放 ,它统一由记录头标区、地址目次区和数据区四部分构成。

    记录头标区,位于 MARC记录的首部 ,其长度均为 2 4个字符。即(00931nam0 2200253   450)其中第0 - 4位字符为该MARC记录的总长度 ,第1 2 -1 6位为MARC记录数据基地址。它的值等于头标区长度与目次区长度之和。
    地址目次区,紧跟记录头标区之后。它由若干个款目组成 ,每个款目均为12个字符 ,依次可分为三个部分 :字段标识符、字段长度、字段起始地址 ,它们分别占3、4、5个字符宽度其中即(0010010000000050017000100100028000271000041000551010008000961020015001
0410500180011910600060013720001550014321000310029821500160032933001750
03456060047005206060013005676060013005806060009005936900014006027110
03900616801002200655) ,字段起始地址是相对于数据基地址而言的。
    数据区,由一些可变长数据字段组成,除 001和005字段由数据和一个字段分隔符组成外,其余每个字段均由两个指示符后接若干子字段组成。每个子字段又以一个子字段标识符开始 ,后接变长数据。每个字段都以一个字段分隔符结尾。每个记录都以一个记录分隔符结尾。
因 MARC记录中使用的记录分隔符、字段分隔符和子字段分隔符为不可见ASCII码控制字符,所以在程序中对这些字符进行识别时,直接使用其 ASCII值来表示相应的控制符号,数据区的字段分隔符为的ASCII码30 ,子字段的分隔符为ASCII码31,记录分隔符为ASCII码29。

二、程序思想:
 1.取得记录的总长度,即取得头标区的0-4位。
 2.取得数据基地址,即取得头标区的12-16位。
 3.取得目次区的内容,即通过"数据基地址 - 头标区长度",取得目次区的长度再通过Mid(Marc记录,25,目次区长度)取得目次区的内容。
 4.取得数据区的内容,即通过"总长度 - 数据基地址",取得数据区的长度,再通过Mid(Marc记录,数据基地址,数据区长度)取得数据区的内容。
 5.取得目次区字段的个数,通过"目次区长度/24"得到。
 6.取得数据区字段的个数及其数据,通过Unbound(split(marc记录,chr(30)))取得字段个数,通过split函数返回的数组取得每个字段的数据。

三、程序实现(Visual basic6.0)
       Option Explicit
       Dim restr As String '返回值
       Public Function marc(aa As String, b As String, c As String) As String  '自定义marc函数,其中aa表示Marc记录,b表示字段标识符,c表示子字段标识符
               Dim slen As Integer 'marc记录总长度
                Dim adress As Integer ‘数据基地址
                Dim sum As Integer  ’字段的个数
                Dim tag As String   ‘字段标识符
                Dim middle As String ’目次区内容
                Dim data As String ‘数据区内容
                Dim xx As Variant '数据字段数组
                Dim zz As Variant '数据子字段数组
                Dim x As Integer   
                Dim jsq As Integer  ’记数器
                Dim temp As Variant ‘临时数组

                slen = Val(Mid(aa, 1, 5))
                adress = Val(Mid(aa, 13, 5))
                sum = (adress - 24) / 12
                middle = Mid(aa, 25, adress - 24 - 1)
                data = Mid(aa, adress, slen - adress + 1)

                x = 1
                jsq = 1
                tag = ""
                temp = Split(data, Chr(30))
                sum = UBound(temp) ' return the max array number,LBound() return the min array number
                While jsq <= sum '通过while函数寻找匹配的字段标识符
                     tag = Mid(middle, x, 3) ' 字段标识符
                    If tag = b Then
                      xx = Split(data, Chr(30)) '数据字段数组
                      start = InStr(1, xx(jsq), c) '子字段起始地址
                      finish = InStr(start + 1, xx(jsq), "$") '子字段结束地址
                      If finish < start Then
                       restr = Mid(xx(jsq), start + 2, Len(xx(jsq)) - start - 1) '当该子字段为字段最后子字段时的内容
                      Else
                       restr = Mid(xx(jsq), start + 2, finish - start - 2) '子字段内容
                      End If
                 End If
                jsq = jsq + 1
                 x = x + 12
             Wend
  End Function
   
     ’调用函数时
     private sub command_click()
     dim aa as string
     aa="00931nam0 2200253   450 0010010000000050017000100100028000271000041000551010008000961020015001
0410500180011910600060013720001550014321000310029821500160032933001750
03456060047005206060013005676060013005806060009005936900014006027110
0390061680100220065500243442020031106133602.0  a7-115-08909-4dCNY15.00  a20030821d2003    em y0chiy0110    ea0 achi  aCNb110000  ay   z   000yy  ar1 a高职高专院校人才培养工作水平评估资料汇编9gao zhi gao zhuan yuan xiao ren cai pei yang gong zuo shui ping ping gu zi liao hui bianf教育部高等教育司编  a北京c人民邮电出版社d2003  a244页d20cm  a本书内容大体可分为五部分:国家、教育部关于高职高专教育改革、发展以及就业等方面的重要法规和文件;教育部有关领导讲话;高职高专院校人才培养工作水平评估系列文件及评估方案等。0 a高等教育x职业教育x人才x培养x评估y中国0 a高等教育0 a职业教育0 a人才  aG718.5v402a教育部9jiao yu bub高等教育司4编 0aCNbNLCc20031107"
     aa = Replace(aa, Chr(31), "$") '把子字段的分隔符换成$,以便在处理时进行分割
     Call marc(aa, "200", "$a") '调用函数,取得题名
     text1.text=restr  '在文本框中显示题名信息
     end sub

四、总结
        通过上面的介绍,我已经把其处理过程及程序全部,写完了不知道对大家有没有帮助,如果有什么问题,欢迎发表评论!!!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值