博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
开源代码库_3个开源代码库来处理MARC格式的记录
阅读量:2528 次
发布时间:2019-05-11

本文共 9734 字,大约阅读时间需要 32 分钟。

开源代码库

欢迎回到Nooks&Crannies! 在为我的婚礼休假一个月之后,我一直在为即将到来的专栏挖掘一些有趣的地方。 这个月,我将看一些开放源代码库,开发人员可以使用它们来处理MARC格式的记录。

MARC新手的一些背景知识

MARC代表机读目录记录。 这种格式最早是在1960年代为美国国会图书馆开发的,目的是促进图书馆之间书目记录的交换。 到1970年代中期,它已成为一种国际标准,已在世界范围内使用。

MARC格式有多种变体。 MARC21是1990年代USMARC和CANMARC的合并,当时使用的是美国和加拿大的变体,其他国家也有自己的格式。 在欧洲大部分地区,UNIMARC是最常见的变体。 所有的这些记录都格式化一样,用的是用来包含的信息标签的结构, 目录 ,告诉哪些变量是在记录,它们位于何处。

每个标签在每种格式下都表示特定的含义。 例如,在MARC21书目格式中,245标签保存有关作品标题的信息。 其他标签中还包含其他信息,包括出版商,作者,实体书的大小,出版日期和主题。

如果仅将记录打印出来,记录的格式将很难阅读。 它最初是为通过9磁道磁带进行串行交换而设计的,并且在我的职业生涯的早期,即1990年代,这种介质仍在使用。 记录的前五个字节是数字,并告诉您记录的长度(以字节为单位),包括这五个字节。 聪明的现代书呆子会立即意识到这种结构的局限性:记录的长度不能为100,000个字节。 接下来是标签目录,告诉要查找的标签以及每个标签从哪个字节开始。 之后是标签数据,其后的下一个字节是下一条记录的第一个字节。 领导者/目录/标签结构通常在ISO-2709中定义; MARC21或UNIMARC是定义标签含义的格式。

是的,按照现代标准,这是一种设计不良的格式。 是的,它需要以最坏的方式进行更新,但这是另一篇文章的主题。 在本文中,我将向您展示三个代码库,您可以使用它们来操纵MARC记录,而不必了解奥术标签目录的所有细节。

的Java:MARC4J

MARC4J允许创建迭代器来读取输入流(例如文件),并使用它在流中找到的MARC21或UNIMARC记录进行操作。 当然,也有记录写入工具,以及用于详细检查记录的迭代器。 这是一个快速的示例,它将读取记录文件,并且如果字段245中子标题a的标题以字母J开头,则将其写入另一个文件:

import      
org.marc4j.MarcReader
;
import
org.marc4j.MarcStreamReader
;
import
org.marc4j.MarcStreamWriter
;
import
org.marc4j.marc.Record
;
import
org.marc4j.marc.DataField
;
import
org.marc4j.marc.Subfield
;
import
java.io.InputStream
;
import
java.io.OutputStream
;
import
java.io.FileInputStream
;
import
java.io.FileOutputStream
;
public
class JMarcExample
{
 
public
static
void main
( args
[
]
)
throws
{
     in  
=
new
(
"inputfile.mrc"
)
;
    out
=
new
(
"outputfile.mrc"
)
;
    MarcReader reader
=
new MarcStreamReader
( in
)
;
    MarcWriter writer
=
new MARCStreamWriter
( out
)
;
   
while
( reader.
hasNext
(
)
)
{
      Record record
= reader.
next
(
)
;
      datafield
=
( DataField
) record.
getVariableField
(
"245"
)
;
      list subfields
= datafield.
getSubfields
(
)
;
      i
= subfields.
iterator
(
)
;
         
     
while
( i.
hasNext
(
)
)
{
        Subfield subfield
=
( Subfield
) i.
next
(
)
;
       
char code
= subfield.
getCode
(
)
;
       
if
( code
==
'a'
)
{
          data
= subfield.
getData
(
)
;
         
if
( data.
startsWith
(
"J"
)
)
{
            writer.
write
( record
)
;
         
}
       
}
     
}
   
}
 
}
}

MARC4J还包括用于Unicode的处理程序,对于MARCXML变体(MARC记录以XML呈现),标签结构更易于人眼阅读,但它的含义却比您想象的复杂得多 。 MARC4J不了解245标签的实际含义 ,因此,从这个意义上讲,它应该能够读取和写入任何ISO-2709格式的记录。

MARC4J已根据LGPL V2.1许可,可在 。

C#:CSharp_MARC

CSharp_MARC具有用于导入和导出MARC21和MARCXML记录的丰富工具集,包括记录验证以及允许批量编辑记录的搜索和替换工具。 它还内置了一些报告工具,用于报告版权年份或类别。 它非常轻巧,每分钟可处理多达28,000条记录。

这是一个示例程序,该程序读取MARC21记录的文件,并按记录出现的顺序从每个记录的100标签(子字段a)中打印出作者姓名:

using      
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
using
MARC
;
using
System.IO
;
namespace CSharp_Show_Authors
{
 
class Program
 
{
   
static
void Main
(
string
[
] args
)
   
{
     
string rawMarc
= File
.
ReadAllText
(
"inputfile.mrc"
)
;
      FileMARC marcRecords
= FileMARC
( rawMarc
)
;
     
foreach
( Record record
in marcRecords
)
     
{
        Field authorField
= record
[
"100"
]
;
       
if
( authorfield
.
IsDataField
(
)
)
       
{
          DataField authorDataField
=
( Datafield
) authorField
;
          Subfield authorName
= authorDataField
[
'a'
]
;
          Console
.
WriteLine
( authorName
.
Data
)
;
       
}
       
else
if
( authorField
.
IsControlField
(
)
)
       
{
         
//unreachable
          Console
.
WriteLine
(
"Something awful has happened. The author field should never be a control field!"
)
;
       
}
     
}
   
}
 
}
}

与MARC4J一样,CSharp_MARC读取器和写入器工具并不真正在乎书目记录中每个标签的实际含义 ,因此应可用于UNIMARC或其他MARC变体。 但是,内置的验证工具似乎仅限于MARC21和MARCXML。 CSharp_MARC已获得GPL V3.0的许可,可在 。

Perl 5:MARC :: Record

您真的不认为我会在没有Perl的情况下放弃本文,对吗? 与此处的其他工具一样,MARC :: Record具有处理您可能有的任何ISO-2709格式的记录读取或写入需求的机制。 它具有一个内置的漂亮打印机,它可以处理将字段插入或删除到记录中,并会正确更新输出中的标记目录。 它不像C#库那样功能丰富,但可以处理大多数基本的记录操作需求。 我已经在自己的工作中使用了多年的库。 (免责声明:MARC :: Record由我的好朋友和同事维护。)

这是一个示例脚本,用于读取MARC21记录的文件,并写出作者(100个子字段a)和标题(245个子字段a)的竖线分隔文件:

use strict      
;
use warnings
;
use MARC
::
File
::
USMARC
;
use MARC
::
Record
;
use MARC
::
Batch
;
use MARC
::
Charset
;
my
$in_fh  
= IO
::
File
->
new
(
"inputfile.mrc"
)
;
my
$batch
= MARC
::
Batch
->
new
(
'USMARC'
,
$in_fh
)
;
$batch
->
warnings_off
(
)
;
$batch
->
strict_off
(
)
;
my
$iggy  
= MARC
::
Charset
::
ignore_errors
(
1
)
;
my
$setting
= MARC
::
Charset
::
assume_encoding
(
'marc8'
)
;
my
$out_fh
,
">:utf8"
,
"outputfile.psv"
;
RECORD
:
while
(
)
{
 
my
$this_record
=
$batch
->
next
(
)
;
 
last RECORD
unless
(
$this_record
)
;
 
my
$author
=
$this_record
->
field
(
'100'
)
->
subfield
(
'a'
)
;
 
my
$title  
=
$this_record
->
field
(
'245'
)
->
subfield
(
'a'
)
;
 
$out_fh
"$author|$title \n "
;
}
$in_fh
;
$out_fh
;

MARC :: Record在上可用,并且在Perl许可下可用。 迄今为止,还没有人为Perl 6编写MARC处理程序。 我可以听到六个同事大喊“自愿”! 现在在我身上...

我做了一些开源搜索

我在GitHub上做了一些挖掘,并很快在 , , , 和找到了库。 我没有测试它们中的任何一个,所以它们可能是不完整的或不完整的,但是对于您想要使用的任何语言,很可能您会找到一个适合您的模块。

翻译自:

开源代码库

转载地址:http://kfjzd.baihongyu.com/

你可能感兴趣的文章
CSS3 transform制作的漂亮的滚动式导航
查看>>
《小强升职记——时间管理故事书》读书笔记
查看>>
Alpha 冲刺(3/10)
查看>>
spring中的ResourceBundleMessageSource使用和测试示例
查看>>
Ubuntu菜鸟入门(五)—— 一些编程相关工具
查看>>
Codeforces 279D The Minimum Number of Variables 状压dp
查看>>
打分排序系统漫谈2 - 点赞量?点赞率?! 置信区间!
查看>>
valgrind检测linux程序内存泄露
查看>>
Hadoop以及组件介绍
查看>>
1020 Tree Traversals (25)(25 point(s))
查看>>
第一次作业
查看>>
“==”运算符与equals()
查看>>
单工、半双工和全双工的定义
查看>>
Hdu【线段树】基础题.cpp
查看>>
时钟系统
查看>>
BiTree
查看>>
5个基于HTML5的加载动画推荐
查看>>
水平权限漏洞的修复方案
查看>>
静态链接与动态链接的区别
查看>>
Android 关于悬浮窗权限的问题
查看>>