X-Git-Url: http://git.equinoxoli.org/?p=migration-tools.git;a=blobdiff_plain;f=fingerprinter;h=f388174a447f8bc0554d384aa58b9389b71a4eb2;hp=6e04e0ba89cf4eb08983896c79f2ff01755dd0ee;hb=b4a45202fa9b19f2e38c22bafa36388d1e004dfe;hpb=4ee76d3146c0b0f2b9c42b04dac2487c777e9165 diff --git a/fingerprinter b/fingerprinter index 6e04e0b..f388174 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'; @@ -8,6 +25,7 @@ use MARC::Batch; use Unicode::Normalize; use MARC::File::XML ( BinaryEncoding => 'utf-8' ); use Equinox::Migration::SubfieldMapper; +use Equinox::Migration::Utils qw/normalize_oclc_number/; my $conf = {}; # configuration hashref my $count = 0; my $scount = 0; @@ -16,18 +34,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,11 +113,14 @@ sub populate_marc { } unless ($marc{date1} and $marc{date1} =~ /\d{4}/) { my $my_260 = $record->field('260'); - my $date1 = $my_260->subfield('c') if $my_260; - if (defined $date1 and $date1 =~ /\d{4}/) { - $marc{date1} = $date1; - $marc{fudgedate} = 1; - print XF ">> using 260c as date1 at rec $count\n"; + 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}/) { + $marc{date1} = $date1; + $marc{fudgedate} = 1; + print XF ">> using 260c as date1 at rec $count\n"; + } } } @@ -121,13 +149,24 @@ sub populate_marc { # oclc $marc{oclc} = []; - push @{ $marc{oclc} }, $record->field('001')->as_string() - if ($record->field('001') and $record->field('003') and - $record->field('003')->as_string() =~ /OCo{0,1}LC/); + if ($record->field('001') && + $record->field('003') && + $record->field('003')->as_string() =~ /OCo{0,1}LC/ && + defined normalize_oclc_number($record->field('001')->as_string())) { + push @{ $marc{oclc} }, normalize_oclc_number($record->field('001')->as_string()); + } for ($record->field('035')) { my $oclc = $_->subfield('a'); - push @{ $marc{oclc} }, $oclc - if (defined $oclc and $oclc =~ /\(OCoLC\)/ and $oclc =~/([0-9]+)/); + if (defined $oclc && + ($oclc =~ /\(OCoLC\)/ || $oclc =~ /(ocm|ocl7|ocn|on)/) && + defined normalize_oclc_number($oclc)) { + push @{ $marc{oclc} }, normalize_oclc_number($oclc); + } + } + + 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) @@ -143,6 +182,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')) { @@ -317,6 +360,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}} ) { @@ -329,11 +380,11 @@ sub dump_fingerprints { } } - if ($conf->{fingerprints}{edition} and $marc->{edition}) { + if ($conf->{fingerprints}{edition} and $marc->{edition} and $marc->{author}) { print OF join("\t", $marc->{score}, $marc->{id}, "edition", $marc->{item_form}, $marc->{date1}, $marc->{record_type}, $marc->{bib_lvl}, - $marc->{title}, $marc->{edition}), "\n"; + $marc->{title}, $marc->{author}, $marc->{edition}), "\n"; } if ($conf->{fingerprints}{issn} and $marc->{issn}) { @@ -465,6 +516,7 @@ sub initialize { 'arbitrarily-lose-below=i', 'newwins', 'excludelist=s', + 'ignoresubtitle|i', 'quiet|q', 'help|h', ); @@ -477,6 +529,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{$_}; @@ -559,13 +612,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