本文共 9734 字,大约阅读时间需要 32 分钟。
开源代码库
欢迎回到Nooks&Crannies! 在为我的婚礼休假一个月之后,我一直在为即将到来的专栏挖掘一些有趣的地方。 这个月,我将看一些开放源代码库,开发人员可以使用它们来处理MARC格式的记录。
MARC代表机读目录记录。 这种格式最早是在1960年代为美国国会图书馆开发的,目的是促进图书馆之间书目记录的交换。 到1970年代中期,它已成为一种国际标准,已在世界范围内使用。
MARC格式有多种变体。 MARC21是1990年代USMARC和CANMARC的合并,当时使用的是美国和加拿大的变体,其他国家也有自己的格式。 在欧洲大部分地区,UNIMARC是最常见的变体。 所有的这些记录都格式化一样,用的是用来包含的信息标签的结构, 目录 ,告诉哪些变量是在记录,它们位于何处。
每个标签在每种格式下都表示特定的含义。 例如,在MARC21书目格式中,245标签保存有关作品标题的信息。 其他标签中还包含其他信息,包括出版商,作者,实体书的大小,出版日期和主题。
如果仅将记录打印出来,记录的格式将很难阅读。 它最初是为通过9磁道磁带进行串行交换而设计的,并且在我的职业生涯的早期,即1990年代,这种介质仍在使用。 记录的前五个字节是数字,并告诉您记录的长度(以字节为单位),包括这五个字节。 聪明的现代书呆子会立即意识到这种结构的局限性:记录的长度不能为100,000个字节。 接下来是标签目录,告诉要查找的标签以及每个标签从哪个字节开始。 之后是标签数据,其后的下一个字节是下一条记录的第一个字节。 领导者/目录/标签结构通常在ISO-2709中定义; MARC21或UNIMARC是定义标签含义的格式。
是的,按照现代标准,这是一种设计不良的格式。 是的,它需要以最坏的方式进行更新,但这是另一篇文章的主题。 在本文中,我将向您展示三个代码库,您可以使用它们来操纵MARC记录,而不必了解奥术标签目录的所有细节。
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许可,可在 。
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的情况下放弃本文,对吗? 与此处的其他工具一样,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/