开源代码库_3个开源代码库来处理MARC格式的记录

本文介绍了三个开源代码库——MARC4J(Java)、CSharp_MARC(C#)和MARC::Record(Perl 5),用于处理MARC格式的图书馆目录记录。这些库提供读取、写入和操作MARC21、UNIMARC等格式的功能,简化了对这种格式的理解和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开源代码库

欢迎回到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 ( String args [ ] ) throws Exception {

    InputStream  in   = new FileInputStream ( "inputfile.mrc" ) ;
    OutputStream out = new FileOutputStream ( "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' ) {
          String data = subfield. getData ( ) ;
          if ( data. startsWith ( "J" ) ) {
            writer. write ( record ) ;
          }
        }
      }
    }
  }
}

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

MARC4J已根据LGPL V2.1许可,可在GitHub上获得

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 = new 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的许可,可在GitHub上获得

Perl 5:MARC :: Record

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

这是一个示例脚本,用于读取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' ) ;
open 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' ) ;
  print $out_fh "$author|$title \n " ;
}
close $in_fh ;
close $out_fh ;

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

我做了一些开源搜索

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

翻译自: https://opensource.com/article/17/4/bit-about-marc-handlers

开源代码库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值