From 34597da047b2257b29ce1da435c1ebe3eef972f2 Mon Sep 17 00:00:00 2001 From: Jason Etheridge Date: Tue, 27 May 2008 19:20:00 +0000 Subject: [PATCH] initial import --- Migration Data Work HOWTO.pdf | Bin 0 -> 43693 bytes Migration Data Work HOWTO.txt | 74 +++++++++++ dump_inverse_select_marc.pl | 48 +++++++ fingerprints.pl | 156 ++++++++++++++++++++++++ match_fingerprints.pl | 119 ++++++++++++++++++ query_for_primary_matching_incumbent_record.pl | 47 +++++++ select_marc.pl | 50 ++++++++ set_record_ids.pl | 38 ++++++ trim_marc_based_on_tag_subfield_value.pl | 47 +++++++ 9 files changed, 579 insertions(+), 0 deletions(-) create mode 100644 Migration Data Work HOWTO.pdf create mode 100644 Migration Data Work HOWTO.txt create mode 100755 dump_inverse_select_marc.pl create mode 100755 fingerprints.pl create mode 100755 match_fingerprints.pl create mode 100755 query_for_primary_matching_incumbent_record.pl create mode 100755 select_marc.pl create mode 100755 set_record_ids.pl create mode 100755 trim_marc_based_on_tag_subfield_value.pl diff --git a/Migration Data Work HOWTO.pdf b/Migration Data Work HOWTO.pdf new file mode 100644 index 0000000000000000000000000000000000000000..47d88574164d7e5deb62b602b2ff9826f57da64c GIT binary patch literal 43693 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�|`;Y+gbkO$lVt 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 'utf-8' ); +use MARC::Field; + +my $record_id_file = $ARGV[0]; +my %record_ids; + +open FILE, $record_id_file; +while (my $record_id = ) { + chomp($record_id); $record_ids{ $record_id } = 1; +} +close FILE; + +my $id_tag = $ARGV[1]; my $id_subfield = $ARGV[2]; + +binmode(STDOUT, ':utf8'); +binmode(STDIN, ':utf8'); + +foreach $argnum ( 3 .. $#ARGV ) { + + print STDERR "Processing " . $ARGV[$argnum] . "\n"; + + my $batch = MARC::Batch->new('XML',$ARGV[$argnum]); + $batch->strict_off(); + $batch->warnings_off(); + + my $count = 0; + + while ( my $record = $batch->next() ) { + + $count++; + + my $id = $record->field($id_tag); + if (!$id) { + print STDERR "ERROR: This record is missing a $id_tag field.\n" . $record->as_formatted() . "\n=====\n"; + next; + } + $id = $id->as_string($id_subfield); + + if (! defined $record_ids{ $id }) { + print STDOUT '=-' x 39 . "\n"; + print STDOUT $record->as_formatted() . "\n"; + } + } + print STDERR "Processed $count records.\n"; +} diff --git a/fingerprints.pl b/fingerprints.pl new file mode 100755 index 0000000..a7d43ee --- /dev/null +++ b/fingerprints.pl @@ -0,0 +1,156 @@ +#!/usr/bin/perl +use MARC::Batch; +use MARC::File::XML ( BinaryEncoding => 'utf-8' ); +use MARC::Field; +use Unicode::Normalize; + +my $count = 0; +my $which = $ARGV[0]; +my $id_tag = $ARGV[1]; my $id_subfield = $ARGV[2]; + +binmode(STDOUT, ':utf8'); +binmode(STDIN, ':utf8'); + +foreach $argnum ( 3 .. $#ARGV ) { + + print STDERR "Processing " . $ARGV[$argnum] . "\n"; + + my $batch = MARC::Batch->new('XML',$ARGV[$argnum]); + $batch->strict_off(); + $batch->warnings_off(); + + while ( my $record = $batch->next() ) { + + $count++; + + my $id = $record->field($id_tag); + if (!$id) { + print STDERR "ERROR: This record is missing a $id_tag field.\n" . $record->as_formatted() . "\n=====\n"; + next; + } + $id = $id->as_string($id_subfield); + print STDERR "WARNINGS: Record id " . $id . " : " . join(":",@warnings) . " : continuing...\n" if ( @warnings ); + + my $leader = $record->leader(); + my $record_type = substr($leader,6,1); + my $bib_lvl = substr($leader,7,1); + + my $my_008 = $record->field('008'); + $my_008 = $my_008->as_string() if ($my_008); + my $date1 = substr($my_008,7,4) if ($my_008); + my $date2 = substr($my_008,11,4) if ($my_008); + my $item_form; + if ( $record_type =~ /[gkroef]/ ) { # MAP, VIS + $item_form = substr($my_008,29,1) if ($my_008); + } else { + $item_form = substr($my_008,23,1) if ($my_008); + } + + my $title = $record->field('245'); + if ( $title ) { $title = $title->subfield('a'); } + + my @isbns = (); + my @isbns_020; if ($record->field('020')) { @isbns_020 = $record->field('020'); } + foreach my $f ( @isbns_020 ) { if ($f->subfield('a')) { if ( $f->subfield('a')=~/(\S+)/ ) { push @isbns, $1; } } } + my @isbns_024; if ($record->field('024')) { @isbns_024 = $record->field('024'); } + foreach my $f ( @isbns_024 ) { if ($f->subfield('a')) { if ( $f->subfield('a')=~/(\S+)/ ) { push @isbns, $1; } } } + + my $issn = $record->field('022'); + if ( $issn ) { $issn = $issn->subfield('a'); } + my $lccn = $record->field('010'); + if ( $lccn ) { $lccn = $lccn->subfield('a'); } + my $author; + if ($record->field('100')) { $author = $record->field('100')->subfield('a'); } + if (! $author ) { + if ($record->field('110')) { $author = $record->field('110')->subfield('a'); } + } + if (! $author ) { + if ($record->field('111')) { $author = $record->field('111')->subfield('a'); } + } + my $desc = $record->field('300'); + if ( $desc ) { $desc = $desc->subfield('a'); } + my $pages; + if ($desc =~ /(\d+)/) { $pages = $1; } + my $my_260 = $record->field('260'); + my $publisher = $my_260->subfield('b') if ( $my_260 ); + my $pubyear = $my_260->subfield('c') if ( $my_260 ); + if ( $pubyear ) { + if ( $pubyear =~ /(\d\d\d\d)/ ) { $pubyear = $1; } else { $pubyear = ''; } + } + my $edition = $record->field('250'); + if ( $edition ) { $edition = $edition->subfield('a'); } + + # NORMALIZE + if ($record_type == ' ') { $record_type = 'a'; } + if ($title) { + $title = NFD($title); $title =~ s/[\x{80}-\x{ffff}]//go; + $title = lc($title); + $title =~ s/\W+$//go; + } + if ($author) { + $author = NFD($author); $author =~ s/[\x{80}-\x{ffff}]//go; + $author = lc($author); + $author =~ s/\W+$//go; + if ($author =~ /^(\w+)/) { + $author = $1; + } + } + if ($publisher) { + $publisher = NFD($publisher); $publisher =~ s/[\x{80}-\x{ffff}]//go; + $publisher = lc($publisher); + $publisher =~ s/\W+$//go; + if ($publisher =~ /^(\w+)/) { + $publisher = $1; + } + } + + # SPIT OUT FINGERPRINTS FROM THE "LOIS ALGORITHM" + # If we're not getting good matches, we may want to change this. The same thing goes for some other fields. + if ($item_form && ($date1 =~ /\d\d\d\d/) && $record_type && $bib_lvl && $title) { + + if ($which eq "primary") { + print STDOUT join("\t",$id,$item_form,$date1,$record_type,$bib_lvl,$title) . "\n"; + } else { + + # case a : isbn and pages + if (scalar(@isbns)>0 && $pages) { + foreach my $isbn ( @isbns ) { + print STDOUT join("\t",$id,"case a",$item_form,$date1,$record_type,$bib_lvl,$title,$isbn,$pages) . "\n"; + } + } + + # case b : edition + if ($edition) { + print STDOUT join("\t",$id,"case b",$item_form,$date1,$record_type,$bib_lvl,$title,$edition) . "\n"; + } + + # case c : issn + if ($issn) { + print STDOUT join("\t",$id,"case c",$item_form,$date1,$record_type,$bib_lvl,$title,$issn) . "\n"; + } + + # case d : lccn + if ($lccn) { + print STDOUT join("\t",$id,"case d",$item_form,$date1,$record_type,$bib_lvl,$title,$lccn) . "\n"; + } + + # case e : author, publisher, pubyear, pages + if ($author && $publisher && $pubyear && $pages) { + print STDOUT join("\t",$id,"case e",$item_form,$date1,$record_type,$bib_lvl,$title,$author,$publisher,$pubyear,$pages) . "\n"; + } + + } + + } else { + print STDERR "Record " . $id . " did not make the cut: "; + print STDERR "Missing item_form. " unless ($item_form); + print STDERR "Missing valid date1. " unless ($date1 =~ /\d\d\d\d/); + print STDERR "Missing record_type. " unless ($record_type); + print STDERR "Missing bib_lvl. " unless ($bib_lvl); + print STDERR "Missing title. " unless ($title); + print STDERR "\n"; + + } + } + print STDERR "Processed $count records\n"; +} diff --git a/match_fingerprints.pl b/match_fingerprints.pl new file mode 100755 index 0000000..a306640 --- /dev/null +++ b/match_fingerprints.pl @@ -0,0 +1,119 @@ +#!/usr/bin/perl + +my $dataset = $ARGV[0]; + +my $match_to = $ARGV[1]; +my $match_these = $ARGV[2]; +my $match_to_score = $ARGV[3]; +my $match_these_score = $ARGV[4]; + +print "match_to: $match_to match_these: $match_these\n"; + +my %pines; +my %incoming; +my %match; +my %candidate_match; +my %score; + +open FILE, $match_to; +while (my $line = ) { + chomp $line; + my @fields = split(/\t/,$line); + my $id = shift @fields; + my $fp = join '^', @fields; + if (! defined $pines{ $fp }) { $pines{ $fp } = []; } + push @{ $pines{ $fp } }, $id; +} +close FILE; + +open FILE, $match_these; +while (my $line = ) { + chomp $line; + my @fields = split(/\t/,$line); + my $id = shift @fields; + my $fp = join '^', @fields; + if (! defined $incoming{ $fp }) { $incoming{ $fp } = []; } + push @{ $incoming{ $fp } }, $id; +} +close FILE; + +foreach my $file ( $match_to_score, $match_from_score ) { + open FILE, $file; + while (my $line = ) { + chomp $line; + my @fields = split(/\|/,$line); + my $id = shift @fields; $id =~ s/\D//g; + my $holdings = shift @fields; $holdings =~ s/\D//g; + my $subtitle = shift @fields; $subtitle =~ s/^\s+//; $subtitle =~ s/\s+$//; + $score{ $id } = [ $holdings, $subtitle ]; + } + close FILE; +} + +open RECORD_IDS, ">match.record_ids"; +foreach my $fp ( keys %incoming ) { + + if (defined $pines{ $fp }) { # match! + + foreach my $id ( @{ $incoming{ $fp } } ) { + + print RECORD_IDS "$id\n"; + if ( ! defined $candidate_match{ $id } ) { $candidate_match{ $id } = []; } + push @{ $candidate_match{ $id } }, $fp; + } + } +} +close RECORD_IDS; + +foreach my $id ( keys %candidate_match ) { + + my $subtitle; if (defined $score{ $id }) { $subtitle = $score{ $id }[1]; } + + my @fps = @{ $candidate_match{ $id } }; + my @candidate_pines = (); + + my $subtitle_matched = 0; + my $highest_holdings = 0; + my $best_pines_id; + + foreach my $fp ( @fps ) { + foreach my $pines_id ( @{ $pines{ $fp } } ) { + my $pines_subtitle; if (defined $score{ $pines_id }) { $pines_subtitle = $score{ $pines_id }[1]; } + my $pines_holdings; if (defined $score{ $pines_id }) { $pines_holdings = $score{ $pines_id }[0]; } + if ($pines_subtitle eq $subtitle) { + if (! $subtitle_matched) { + $subtitle_matched = 1; + $best_pines_id = $pines_id; + $highest_holdings = -1; + } + } else { + if ($subtitle_matched) { next; } + } + if ( $pines_holdings > $highest_holdings ) { + $highest_holdings = $pines_holdings; + $best_pines_id = $pines_id; + } + } + } + print RECORD_IDS "$best_pines_id\n"; + if (! defined $match{ $best_pines_id } ) { $match{ $best_pines_id } = [ $best_pines_id ]; } + push @{ $match{ $best_pines_id } }, $id; +} + + + +open GROUPINGS, ">match.groupings"; +foreach my $k ( keys %match ) { + + print GROUPINGS join("^", + "checking", + $dataset, + $match{ $k }[0], + join(",",@{ $match{ $k } }), + join(",",@{ $match{ $k } }) + ) . "\n"; + +} +close GROUPINGS; + + diff --git a/query_for_primary_matching_incumbent_record.pl b/query_for_primary_matching_incumbent_record.pl new file mode 100755 index 0000000..ee504dd --- /dev/null +++ b/query_for_primary_matching_incumbent_record.pl @@ -0,0 +1,47 @@ +#!/usr/bin/perl +use DBI; +use Data::Dumper; + +################ THIS RESOURCE IS FOR PINES PRODUCTION +my $SOURCE_DBI_RESOURCE = "dbi:Pg:dbname=sparkle;host=10.1.0.12;port=5432"; +my $SOURCE_DBI_USER = 'postgres'; +my $SOURCE_DBI_PASSWD = ''; +my $source_dbh = DBI->connect($SOURCE_DBI_RESOURCE, $SOURCE_DBI_USER, $SOURCE_DBI_PASSWD) or die("Database error: $DBI::errstr"); +my $primary_fingerprint_tablename = "public.quitman_full_fingerprint_set"; + +sub fetch_record { + + my $item_form = shift; + my $date1 = shift; + my $record_type = shift; + my $bib_lvl = shift; + my $title = shift; + my $sql = "select id from $primary_fingerprint_tablename where " . join(' AND ', + " item_form = ".$source_dbh->quote($item_form), + " substring = ".$source_dbh->quote($date1), + " item_type = ".$source_dbh->quote($record_type), + " bib_level = ".$source_dbh->quote($bib_lvl), + " title = ".$source_dbh->quote($title), + ); + my $source_sth = $source_dbh->prepare($sql) or die("prepare error: $DBI::errstr \n[$sql]"); + $source_sth->execute() or die("execute error: $DBI::errstr \n[$sql]"); + + while ( my ($id) = $source_sth->fetchrow_array ) { + + print "$id\n"; + + } + $source_sth->finish(); + + +} + +while (my $line = <>) { + chomp $line; + my ($id,$item_form,$date1,$record_type,$bib_lvl,$title) = split(/\t/,$line); + if ($id eq 'id') { next; } + fetch_record($item_form,$date1,$record_type,$bib_lvl,$title); +} + +$source_dbh->disconnect; + diff --git a/select_marc.pl b/select_marc.pl new file mode 100755 index 0000000..152bd1c --- /dev/null +++ b/select_marc.pl @@ -0,0 +1,50 @@ +#!/usr/bin/perl +use MARC::Batch; +use MARC::Record; +use MARC::File::XML ( BinaryEncoding => 'utf-8' ); +use MARC::Field; + +my $record_id_file = $ARGV[0]; +my %record_ids; + +open FILE, $record_id_file; +while (my $record_id = ) { + chomp($record_id); $record_ids{ $record_id } = 1; +} +close FILE; + +my $id_tag = $ARGV[1]; my $id_subfield = $ARGV[2]; + +binmode(STDOUT, ':utf8'); +binmode(STDIN, ':utf8'); + +foreach $argnum ( 3 .. $#ARGV ) { + + print STDERR "Processing " . $ARGV[$argnum] . "\n"; + + my $batch = MARC::Batch->new('XML',$ARGV[$argnum]); + $batch->strict_off(); + $batch->warnings_off(); + + my $count = 0; + + while ( my $record = $batch->next() ) { + + $count++; + + my $id = $record->field($id_tag); + if (!$id) { + print STDERR "ERROR: This record is missing a $id_tag field.\n" . $record->as_formatted() . "\n=====\n"; + next; + } + $id = $id->as_string($id_subfield); + + if (defined $record_ids{ $id }) { + open FILE, ">$id"; + binmode(FILE, ':utf8'); + print FILE $record->as_xml(); + close FILE; + } + } + print STDERR "Processed $count records.\n"; +} diff --git a/set_record_ids.pl b/set_record_ids.pl new file mode 100755 index 0000000..911ed10 --- /dev/null +++ b/set_record_ids.pl @@ -0,0 +1,38 @@ +#!/usr/bin/perl +use MARC::Batch; +use MARC::Record; +use MARC::File::XML ( BinaryEncoding => 'utf-8' ); +use MARC::Field; + +my $initial_record_number = $ARGV[0]; +my $record_tag_number = $ARGV[1]; +my $record_tag_subfield = $ARGV[2]; +my $count = 0; + +binmode(STDOUT, ':utf8'); +binmode(STDIN, ':utf8'); + +foreach $argnum ( 3 .. $#ARGV ) { + + print STDERR "Processing " . $ARGV[$argnum] . ", starting record id at $initial_record_number\n"; + + my $batch = MARC::Batch->new('XML',$ARGV[$argnum]); + #$batch->strict_off(); + #$batch->warnings_off(); + + while ( my $record = $batch->next() ) { + + $count++; + + print STDERR "WARNINGS: Record $count : " . join(":",@warnings) . " : continuing...\n" if ( @warnings ); + + while ($record->field($record_tag_number)) { $record->delete_field( $record->field($record_tag_number) ); } + my $new_id = $initial_record_number + $count - 1; + my $new_id_field = MARC::Field->new( $record_tag_number, ' ', ' ', $record_tag_subfield => $new_id); + $record->append_fields($new_id_field); + + print $record->as_xml(); + } + + print STDERR "Processed $count records. Last record id at " . ($initial_record_number + $count - 1) . "\n"; +} diff --git a/trim_marc_based_on_tag_subfield_value.pl b/trim_marc_based_on_tag_subfield_value.pl new file mode 100755 index 0000000..c8f1925 --- /dev/null +++ b/trim_marc_based_on_tag_subfield_value.pl @@ -0,0 +1,47 @@ +#!/usr/bin/perl +use MARC::Batch; +use MARC::File::XML ( BinaryEncoding => 'utf-8' ); +use MARC::Field; +use Unicode::Normalize; + + +my $tag_number = $ARGV[0]; +my $tag_subfield = $ARGV[1]; +my $tag_value = $ARGV[2]; + +my $count = 0; + +binmode(STDOUT, ':utf8'); +binmode(STDIN, ':utf8'); + +foreach $argnum ( 3 .. $#ARGV ) { + + print STDERR "Processing " . $ARGV[$argnum] . "\n"; + + my $batch = MARC::Batch->new('XML',$ARGV[$argnum]); + $batch->strict_off(); + $batch->warnings_off(); + + while ( my $record = $batch->next() ) { + + $count++; + + print STDERR "WARNINGS: Record $count : " . join(":",@warnings) . " : continuing...\n" if ( @warnings ); + + my $keep_me = 0; + + my @tags = (); + my @tags; if ($record->field($tag_number)) { @tags = $record->field($tag_number); } + foreach my $f ( @tags ) { + if ($f->subfield($tag_subfield)) { + if ( $f->subfield($tag_subfield)=~ m/($tag_value)/i ) { $keep_me = 1; } + } + } + + if ($keep_me) { + print STDOUT $record->as_xml(); + } + + } + print STDERR "Processed $count records\n"; +} -- 1.7.2.5