X-Git-Url: http://git.equinoxoli.org/?p=migration-tools.git;a=blobdiff_plain;f=fingerprinter;h=03a67a11f78d6f09f77c6ff2a991b57d7502f1d7;hp=098747db52e3da8fb799790e1c428c3f543a928b;hb=d10d13ffea1f2d6faeaaab789ebb1e690611d3d4;hpb=7e592e43286a01bfa2d5ad4151e95655d12ed145 diff --git a/fingerprinter b/fingerprinter index 098747d..03a67a1 100755 --- a/fingerprinter +++ b/fingerprinter @@ -1,4 +1,21 @@ #!/usr/bin/perl + +# Copyright 2009-2012, Equinox Software, Inc. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + use strict; use warnings; use open ':utf8'; @@ -16,18 +33,25 @@ $| = 1; initialize($conf); -open OF, '>', $conf->{output}; -open XF, '>', $conf->{exception}; +open OF, '>', $conf->{output} or die "$0: cannot open output file $conf->{output}: $!\n"; +open XF, '>', $conf->{exception} or die "$0: cannot open exception file $conf->{exception}: $!\n"; for my $file (@ARGV) { print XF "Processing $file\n"; - my $batch = undef; my $record = undef; - $batch = MARC::Batch->new($conf->{marctype}, $file); + my $batch = MARC::Batch->new($conf->{marctype}, $file); $batch->strict_off(); $batch->warnings_off(); - while ( $record = $batch->next ) { + my $record; + while ( 1 ) { + eval { $record = $batch->next; }; + if ($@) { + import MARC::File::XML; + print "skipping bad record: $@\n"; + next; + } + last unless $record; $count++; progress_ticker(); my $marc = undef; unless ( defined $record ) @@ -88,7 +112,7 @@ sub populate_marc { } unless ($marc{date1} and $marc{date1} =~ /\d{4}/) { my $my_260 = $record->field('260'); - if ($my_260) { + if ($my_260 and $my_260->subfield('c')) { my $date1 = $my_260->subfield('c'); $date1 =~ s/\D//g; if (defined $date1 and $date1 =~ /\d{4}/) { @@ -133,6 +157,11 @@ sub populate_marc { if (defined $oclc and $oclc =~ /\(OCoLC\)/ and $oclc =~/([0-9]+)/); } + if ($record->field('999')) { + my $koha_bib_id = $record->field('999')->subfield('c'); + $marc{koha_bib_id} = $koha_bib_id if defined $koha_bib_id and $koha_bib_id =~ /^\d+$/; + } + # "Accompanying material" and check for "copy" (300) if ($record->field('300')) { $marc{accomp} = $record->field('300')->subfield('e'); @@ -146,6 +175,10 @@ sub populate_marc { $marc{pages} = $1 if (defined $marc{desc} and $marc{desc} =~ /(\d+)/); $marc{title} = $record->field('245')->subfield('a') if $record->field('245'); + $marc{title} .= ' ' . $record->field('245')->subfield('b') + if ($record->field('245') and + $record->field('245')->subfield('b') and + not $conf->{ignoresubtitle}); $marc{edition} = $record->field('250')->subfield('a') if $record->field('250'); if ($record->field('260')) { @@ -320,6 +353,14 @@ sub dump_fingerprints { } } + if ($conf->{fingerprints}{koha_bib_id} and exists $marc->{koha_bib_id}) { + print OF join("\t", $marc->{score}, $marc->{id}, "z_koha_bib_id", + $marc->{item_form}, $marc->{date1}, + $marc->{record_type}, + $marc->{bib_lvl}, $marc->{title}, + $marc->{koha_bib_id}), "\n"; + } + if ($conf->{fingerprints}{isbn}) { if ((scalar @{ $marc->{isbns} } > 0) and $marc->{pages}) { foreach my $isbn ( @{ $marc->{isbns}} ) { @@ -468,6 +509,7 @@ sub initialize { 'arbitrarily-lose-below=i', 'newwins', 'excludelist=s', + 'ignoresubtitle|i', 'quiet|q', 'help|h', ); @@ -480,6 +522,7 @@ sub initialize { my %valid_fps = ( oclc => 1, isbn => 1, issn => 1, lccn => 1, edition => 1, accomp => 1, authpub => 1, baseline => 1, crap => 1, + koha_bib_id => 1, ); for (split /,/, $c->{fingerprints}) { die "Invalid fingerprint '$_'\n" unless $valid_fps{$_}; @@ -562,13 +605,14 @@ Req'd Arguments --prefix=> -p Shared prefix for output/exception files. Will produce PREFIX.fp and PREFIX.fp.ex Options - --tag=N -t Which tag to use (default 903) - --subfield=X -s Which subfield to use (default 'a') - --quiet -q Don't write status messages to STDOUT + --tag=N -t Which tag to use (default 903) + --subfield=X -s Which subfield to use (default 'a') + --quiet -q Don't write status messages to STDOUT + --ignoresubtitle -i Ignore 245\$b and construct the title from 245\$a alone. --fingerprints=LIST Fingerprints to generate, comma separated Default: oclc,isbn,edition,issn,lccn,accomp,authpub - Others: baseline + Others: baseline,koha_bib_id --excludelist=FILE Name of fingerprints exclusions file --scores=LIST Scores to calculate, comma separated