有人做过marc数据的转换吗,问问开始的几个字段数据产生的算法,各位帮帮啊??

wzgme 2004-08-09 09:46:27
有人做数据库转marc数据的吗,问问开始的几个字段数据产生的算法,资料上说是什么系统自动生成,可是我自己写啊,怎么生成啊

谢谢啊。
折磨了我好久了。。。。。
...全文
434 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
isquare 2004-10-27
  • 打赏
  • 举报
回复
老大,我现在也正在做这个,也遇到这个麻烦了,当你看到的时候,给我邮件
MSN:china13520962983@hotmail.com
QQ:57462803
Email:lgj13520962983@yahoo.com.cn
谢谢
jxj0812 2004-10-10
  • 打赏
  • 举报
回复
djkhym(hym) ,你能不能把MARC转数据库,的代码发上来吗?谢谢了。
wzgme 2004-08-11
  • 打赏
  • 举报
回复
对,我想看的就是Init(comdata,Head)这个子程序。。其他应该都解决了。。
djkhym 2004-08-11
  • 打赏
  • 举报
回复
你说的对这个变量确实没有用到,但其中的信息应该在Call Init(comdata, Head)子程序中涉及,因为nam0是Marc数据中的一个重要标识,不可没有。由于时间太久了,差不多淡忘了,中间用到了什么子程序也得仔细看。
djkhym 2004-08-10
  • 打赏
  • 举报
回复
上面过程中需要的一个类型未发送,现发送:
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
djkhym 2004-08-10
  • 打赏
  • 举报
回复
另外还做了一个MARC转数据库,由于太长需要分开发送才行,由于你仅需要数据库转MARC所以也不必发了。
djkhym 2004-08-10
  • 打赏
  • 举报
回复
我将写的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 * 2

Dim 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
wzgme 2004-08-10
  • 打赏
  • 举报
回复
我用的是cnmarc的标准。。。。
后边的字段我都实现了。。。就是在前边的记录头标区和记录标识号这部分,都是数字串,我不知道是怎么算出来的。。资料上说是什么系统自动生成,可我自己做系统啊,怎么自动啊。
djkhym(hym),你做过vb的吗,帮帮忙,找一下实现的原理吧。我分析了好久现成的marc数据,也没明白他的记录头标区怎么产生的。

谢谢各位大哥的回答了。。。。
allan1031 2004-08-10
  • 打赏
  • 举报
回复
很烦琐的
此外,对中文还有特殊的约定
中国国家标准和国际标准还有不同的地方
总的来说
用JAVA来做很累,建议C
wzgme 2004-08-10
  • 打赏
  • 举报
回复
00879nam0 2200229 45 0010013000000050017000130100031000300920022000611000041000831010008001241020015001321050018001471060006001652000039001712100033002102150009002433300353002523330006006056900009006117010006006208010023006260104-8000001
这是一列(一条记录)中的前面部分,后边就是ISBN号那些了。。
我就是这前边200多位不知道是怎么来的。
看你的程序Dim RecCtl As String '形如nam0,但没看到调用的地方啊??
还有你的“JLKZB”,是数据库里的字段吧,可我现在的数据库里没有。。。

非常感谢你的帮助。。。
wzgme 2004-08-10
  • 打赏
  • 举报
回复
太好啊。。。谢谢啊
wzgme 2004-08-09
  • 打赏
  • 举报
回复
就给个算法就行了。。。
什么语言的都可以了。。。
wzgme 2004-08-09
  • 打赏
  • 举报
回复
怎么没人帮忙啊,郁闷啊。。。
wzgme 2004-08-09
  • 打赏
  • 举报
回复
高手来看看啊。好急的了。。。
guihengzhang 2004-08-09
  • 打赏
  • 举报
回复
哦 帮你顶
我都不知道marc是什么?
朋友别哭 2004-08-09
  • 打赏
  • 举报
回复
up
djkhym 2004-08-09
  • 打赏
  • 举报
回复
需要懂DEBUG,然后结合一本MARC的介绍书籍,找一个MARC数据文件解读一下就行了。
djkhym 2004-08-09
  • 打赏
  • 举报
回复
我以前写过VB方面的MARC数据的转换,还行!在中间主要是一些约定的分隔符,如0x2e等,时间太久了,也记不清了,当时是做图书馆管理系统用的。
gsen 2004-08-09
  • 打赏
  • 举报
回复
刚知道marc...
wzgme 2004-08-09
  • 打赏
  • 举报
回复
高手,帮帮我啊。
marc是一种国际通用的书目的存储格式
我也是刚接触啊,做个图书管理的系统。。。
郁闷啊。。。。。
有人知道自动标引吗,那也可以。。。
加载更多回复(1)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧