哦 帮你顶
我都不知道marc是什么?

解决方案 »

  1.   

    marc我也不知道是什么
    看来要学的真是多阿
      

  2.   

    高手,帮帮我啊。
    marc是一种国际通用的书目的存储格式
    我也是刚接触啊,做个图书管理的系统
    郁闷啊。。
    有人知道自动标引吗,那也可以
      

  3.   

    我以前写过VB方面的MARC数据的转换,还行!在中间主要是一些约定的分隔符,如0x2e等,时间太久了,也记不清了,当时是做图书馆管理系统用的。
      

  4.   

    需要懂DEBUG,然后结合一本MARC的介绍书籍,找一个MARC数据文件解读一下就行了。
      

  5.   

    很烦琐的
    此外,对中文还有特殊的约定
    中国国家标准和国际标准还有不同的地方
    总的来说
    用JAVA来做很累,建议C
      

  6.   

    我用的是cnmarc的标准。
    后边的字段我都实现了就是在前边的记录头标区和记录标识号这部分,都是数字串,我不知道是怎么算出来的。。资料上说是什么系统自动生成,可我自己做系统啊,怎么自动啊。
     djkhym(hym),你做过vb的吗,帮帮忙,找一下实现的原理吧。我分析了好久现成的marc数据,也没明白他的记录头标区怎么产生的。谢谢各位大哥的回答了。
      

  7.   

    我将写的VB的代码贴出来你看一下能不能有所感悟,当时我做的时候是一边使用DEBUG分析,一边编写VB程序才试出来的,不过具体的MARC数据也有所区别,我仅是拆分和重建简单的MARC数据。
    Public Sub DBToMarc(Filename As String, Rs As Recordset, GDM As String, CRLF As Boolean)
    Dim i As Long
    Dim tmpstr As String
    Dim F1 As Long
    Dim RecCtl As String '形如nam0
    Dim n As Integer
    Dim C_1D As String * 1
    Dim CrLf_char As String * 2Dim comdata As CommonData
    Dim Head As Control_head
    Dim DIR_Block(11, 3) As String '1为标识,2列为宽度,3列位置
    Dim CTl_Block(11) As String '定义11个目次区
    Dim Total_len As Long
    Dim Cur_len As Long
    Dim Last_Pos As Long
    Dim Stop_char As String * 1
    Dim Begin_char As String * 1
    C_1D = Chr(29)
    CrLf_char = Chr(13) & Chr(10)
    Begin_char = Chr(31)
    Stop_char = Chr(30)
    F1 = FreeFile
    If Len(Dir(Filename)) > 0 Then
     i = MsgBox("文件已经存在,要删除吗?", vbOKCancel + vbInformation, "通知")
     If i = 1 Then
       Kill Filename
     Else
       MsgBox "由于你不想删除文件,本次转换失败!", vbInformation, "通知"
       Exit Sub
     End If
    End If
    Open Filename For Binary Access Write As F1
    '依次扫描记录集,对于记录集中每个成份进行编码
    For i = 1 To 11
    Select Case i
     Case 1
     DIR_Block(i, 1) = "001"
     Case 2
     DIR_Block(i, 1) = "010"
     Case 3
     DIR_Block(i, 1) = "100"
      Case 4
     DIR_Block(i, 1) = "101"
      Case 5
     DIR_Block(i, 1) = "200"
      Case 6
     DIR_Block(i, 1) = "210"
      Case 7
     DIR_Block(i, 1) = "215"
      Case 8
     DIR_Block(i, 1) = "690"
      Case 9
     DIR_Block(i, 1) = "801"
      Case 10
     DIR_Block(i, 1) = "905"
      Case 11
     DIR_Block(i, 1) = "970"
    End Select
    Next i
    Do While Not Rs.EOF
      For i = 1 To 11
      Select Case i
      Case 2, 3, 6, 7, 8, 10, 11
        CTl_Block(i) = "  "
      Case 4
        CTl_Block(i) = "0 "
      Case 5
        CTl_Block(i) = "1 "
      Case 9
        CTl_Block(i) = "  1"
      End Select
      Next i
      CTl_Block(1) = ""
      Call Init(comdata, Head)  For i = 0 To Rs.Fields.Count - 1
       Select Case UCase(Trim(Rs.Fields(i).Name))
       '相应的字段写入相应的区域
       Case "JLKZB", "记录控制号"
        If Not IsNull(Rs(i)) Then
         CTl_Block(1) = Format(Trim(Rs(i)), "0000000000")
        End If
       Case "ISBN", "ISBN号"
        If Not IsNull(Rs(i)) Then CTl_Block(2) = CTl_Block(2) + Chr(31) & "a" & Trim(Rs(i))
       Case "ZZ", "装帧"
        If Not IsNull(Rs(i)) Then CTl_Block(2) = CTl_Block(2) + Chr(31) & "b" & Trim(Rs(i))
       Case "DJ", "单价", "定价", "价格"
        If Not IsNull(Rs(i)) Then CTl_Block(2) = CTl_Block(2) + Chr(31) & "d" & Trim(Rs(i))
       Case "cbrq", "出版日期"
         If Not IsNull(Rs(i)) Then
         If IsDate(Rs(i)) Then
            comdata.Create_time = Format(Trim(Rs(i)), "yyyymmdd")
         Else
            comdata.Create_time = Mid(Trim(Rs(i)) + Space(8), 1, 8)
         End If
         End If
       Case "NF", "YEAR", "年份"
         If Not IsNull(Rs(i)) Then
          comdata.create_year1 = Format(Rs(i), "0000")
         End If
       Case "YZ", "CBZYZ", "语种"
         If Not IsNull(Rs(i)) Then
          CTl_Block(4) = CTl_Block(4) & Chr(31) & "a" & Trim(Rs(i))
         End If
       Case "ZTM", "主题名", "正题名"
         If Not IsNull(Rs(i)) Then
          CTl_Block(5) = CTl_Block(5) & Chr(31) & "a" & Trim(Rs(i))
         End If
       Case "ZRZ01", "ZRZ", "责任者", "第一责任者"
         If Not IsNull(Rs(i)) Then
          CTl_Block(5) = CTl_Block(5) & Chr(31) & "f" & Trim(Rs(i))
         End If
       Case "BTM", "BNTM", "并列题名"
         If Not IsNull(Rs(i)) Then
          CTl_Block(5) = CTl_Block(5) & Chr(31) & "d" & Trim(Rs(i))
         End If
       Case "ZRZ02", "QTZRZ", "其他责任者", "第二责任者", "其它责任者"
         If Not IsNull(Rs(i)) Then
          CTl_Block(5) = CTl_Block(5) & Chr(31) & "g" & Trim(Rs(i))
         End If
       Case "FCH", "分册号", "分册辑号", "分辑号"
         If Not IsNull(Rs(i)) Then
          CTl_Block(5) = CTl_Block(5) & Chr(31) & "h" & Trim(Rs(i))
         End If
       Case "JCH", "卷册号"
        If Not IsNull(Rs(i)) Then
          CTl_Block(5) = CTl_Block(5) & Chr(31) & "v" & Trim(Rs(i))
         End If
       Case "CBD", "出版地", "出版发行地"
         If Not IsNull(Rs(i)) Then
          CTl_Block(6) = CTl_Block(6) & Chr(31) & "a" & Trim(Rs(i))
         End If
       
       Case "CBZ", "出版者", "出版发行者"
         If Not IsNull(Rs(i)) Then
          CTl_Block(6) = CTl_Block(6) & Chr(31) & "c" & Trim(Rs(i))
         End If
       Case "CBRQ", "出版日期", "出版发行日期"
         If Not IsNull(Rs(i)) Then
          CTl_Block(6) = CTl_Block(6) & Chr(31) & "d" & Trim(Rs(i))
         End If
       Case "YS", "页数"
         If Not IsNull(Rs(i)) Then
          CTl_Block(7) = CTl_Block(7) & Chr(31) & "a" & Trim(Rs(i))
         End If
       Case "KB", "开本"
         If Not IsNull(Rs(i)) Then
          CTl_Block(7) = CTl_Block(7) & Chr(31) & "d" & Trim(Rs(i))
         End If
       Case "FLH", "分类号"
         If Not IsNull(Rs(i)) Then
          CTl_Block(8) = CTl_Block(8) & Chr(31) & "a" & Trim(Rs(i))
         End If
       Case "BC", "版次"
         If Not IsNull(Rs(i)) Then
          CTl_Block(8) = CTl_Block(8) & Chr(31) & "v" & Trim(Rs(i))
         End If
    '   Case "GJ", "国家"
    '     If Not IsNull(rs(i)) Then
    '      CTl_Block(9) = CTl_Block(9) & Chr(31) & "a" & Trim(rs(i))
    '     End If
    '   End Select  Next i
        CTl_Block(9) = CTl_Block(9) & Chr(31) & "a" & "CN"
        CTl_Block(10) = CTl_Block(10) & Chr(31) & "a" & Trim(GDM)
        CTl_Block(11) = CTl_Block(11) & Chr(31) & "a" & "科技"
        tmpstr = Trim(CTl_Block(3))
        CTl_Block(3) = Chr(32) & Chr(32) & Chr(31) & "a" & comdata.Create_time & comdata.Create_type
        CTl_Block(3) = CTl_Block(3) & comdata.create_year1 & comdata.create_year2
        CTl_Block(3) = CTl_Block(3) & comdata.Depart_code & comdata.Alter_rec
        CTl_Block(3) = CTl_Block(3) & comdata.yz_code & comdata.yw_code & comdata.char_set
        CTl_Block(3) = CTl_Block(3) & comdata.char_set_app & comdata.tmwz_code
        CTl_Block(3) = CTl_Block(3) & tmpstr
        For i = 1 To 11
          CTl_Block(i) = CTl_Block(i) & Chr(30) '加入休止符
        Next i
       
     '写入文件:据数组中的信息收集写入文件
       Total_len = 0
       For i = 1 To 11
        Cur_len = TestStrLen(CTl_Block(i))
        Total_len = Total_len + Cur_len
        DIR_Block(i, 2) = Format(Cur_len, "0000")
       Next i
       Last_Pos = 0
       For i = 1 To 11
        '置于位置数组
        DIR_Block(i, 3) = Format(Last_Pos, "00000")
        Last_Pos = Val(DIR_Block(i, 2)) + Val(DIR_Block(i, 3))
       Next i
       '设定前24字节中的数据
       Head.Dir_len = Format(24 + 1 + 11 * 12, "00000")
       Head.Head = Format(Total_len + 1 + Val(Head.Dir_len), "00000")
    '   Head.Head = Format(Total_len + Val(Head.Dir_len), "00000")
       
       Put F1, , Head
       For i = 1 To 11
        For k = 1 To 3
         Put F1, , DIR_Block(i, k)
        Next k
       Next i
       Put F1, , Stop_char '结束符
       For i = 1 To 11
        Put F1, , CTl_Block(i)
       Next i
       Put F1, , C_1D
       If CRLF Then Put F1, , CrLf_char
     Rs.MoveNext
    Loop
    Rs.Close
    Close F1
     MsgBox "数据已经转换完毕!", vbInformation, "通知"
    End Sub
      

  8.   

    另外还做了一个MARC转数据库,由于太长需要分开发送才行,由于你仅需要数据库转MARC所以也不必发了。
      

  9.   

    上面过程中需要的一个类型未发送,现发送:
    Type CommonData
      Create_time As String * 8
      Create_type As String * 1
      create_year1 As String * 4
      create_year2 As String * 4
      reader As String * 3
      Depart_code As String * 1
      Alter_rec As String * 1
      yz_code As String * 3
      yw_code As String * 1
      char_set As String * 4
      char_set_app As String * 4
      tmwz_code As String * 2
    End Type
      

  10.   

    00879nam0 2200229   45  0010013000000050017000130100031000300920022000611000041000831010008001241020015001321050018001471060006001652000039001712100033002102150009002433300353002523330006006056900009006117010006006208010023006260104-8000001
    这是一列(一条记录)中的前面部分,后边就是ISBN号那些了。。
    我就是这前边200多位不知道是怎么来的。
    看你的程序Dim RecCtl As String '形如nam0,但没看到调用的地方啊??
    还有你的“JLKZB”,是数据库里的字段吧,可我现在的数据库里没有非常感谢你的帮助
      

  11.   

    你说的对这个变量确实没有用到,但其中的信息应该在Call Init(comdata, Head)子程序中涉及,因为nam0是Marc数据中的一个重要标识,不可没有。由于时间太久了,差不多淡忘了,中间用到了什么子程序也得仔细看。
      

  12.   

    对,我想看的就是Init(comdata,Head)这个子程序。。其他应该都解决了。。
      

  13.   

    djkhym(hym) ,你能不能把MARC转数据库,的代码发上来吗?谢谢了。