Hi Nate,
I've just started playing around with this a bit myself, although I have
to confess that it's quite recent and a hack. But here's what I've been
doing.
Due to consortium issues and the like here's the track I'm taking. I'm
using Perl, since I haven't yet started playing with Ruby. I know, I
know, lame ;).
First, I run a query to grab the bib ids/mfhd ids of some groups of
records that I'm interested in. I'm going for a smaller set probably,
since our whole collection is rather large. Then I run it through a small
script that runs a query (where $recordtype = BIB or MFHD)
my $qry = "SELECT ".$recordtype."_DATA.".$recordtype."_id,
record_segment, "
. "seqnum FROM UIUDB.".$recordtype."_DATA "
. " WHERE ".$recordtype."_DATA.".$recordtype."_ID = ? "
. " ORDER BY seqnum ASC " ;
with the ? set to the id. The results are merged into one string. This
is used to create a MARC::Record object. I add this to a MARC::File::XML
object.
I have in some notes that I need to pad out the bib records when using
this method, but I'm not sure why. I'm not currently duing that
and it hasn't caused any issues yet.
That's it ;). Gives me some nice marcxml. And I haven't tested it at all
yet, just started playing around with it.
I've included some of the code below. Like I said, I just came up with
this really quickly, haven't had a chance to really test it heavily yet.
use strict;
use DBI;
use MARC::Record;
use MARC::file::XML;
use Getopt::Std;
# set the database connection options
#removed :P
my %opts;
getopt('ft',\%opts);
my $recordtype="BIB";
if (uc($opts{'t'}) eq "MFHD" ) {
$recordtype="MFHD";
}
#need to change so can take from command line
if ($opts{'f'}) {
open(IDS,"< ".$opts{'f'}) or die "must set -f input ids";
}
my $qry = "SELECT ".$recordtype."_DATA.".$recordtype."_id,
record_segment, "
. "seqnum FROM UIUDB.".$recordtype."_DATA "
. " WHERE ".$recordtype."_DATA.".$recordtype."_ID = ? "
. " ORDER BY seqnum ASC " ;
my $sth = $dbh->prepare($qry) or die "preparing SQL query $qry.";
my $file = MARC::File::XML->out( $recordtype.'records.xml' );
while (<IDS>) {
chomp;
s/ *$//;
s/^ *//;
my $id = $_;
my $MARC = "";
$sth->execute($id);
while (my ($rec_id, $recseg, $seqnum) = $sth->fetchrow_array) {
$MARC .= $recseg ;
#not sure that the below is needed...there is some
#sort of issue with the "last" record, maybe?
# $MARC .= ' ' x (990-length($recseg)); # Pad each segment to 990
chars.
}
$sth->finish;
my $record = MARC::Record->new_from_usmarc($MARC);
$file->write($record);
}
$file->close();
Jonathan T. Gorman
Research Information Specialist
University of Illinois at Champaign-Urbana
216 Main Library - MC522
1408 West Gregory Drive
Urbana, IL 61801
Phone: (217) 244-4688
|