From c1b77babe22f4dec7164daa9126610592e8dcbd8 Mon Sep 17 00:00:00 2001 From: Rogan Hamby Date: Mon, 8 Jul 2019 14:20:18 -0400 Subject: [PATCH] added version of strip_tag to take string and subfield as arguments --- sql/base/base.sql | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 50 insertions(+), 0 deletions(-) diff --git a/sql/base/base.sql b/sql/base/base.sql index 024d1e1..a9b436b 100644 --- a/sql/base/base.sql +++ b/sql/base/base.sql @@ -4895,6 +4895,56 @@ return $marc_xml->as_xml_record(); $function$; +-- removes tags from record based on tag, subfield and evidence +-- example: strip_tag(marc, '500', 'a', 'gift') will remove 500s with 'gift' as a part of the $a +DROP FUNCTION IF EXISTS migration_tools.strip_tag(TEXT,TEXT,TEXT,TEXT); +CREATE OR REPLACE FUNCTION migration_tools.strip_tag(marc TEXT, tag TEXT, subfield TEXT, evidence TEXT) + RETURNS TEXT + LANGUAGE plperlu +AS $function$ +use strict; +use warnings; + +use MARC::Record; +use MARC::File::XML (BinaryEncoding => 'utf8'); + +binmode(STDERR, ':bytes'); +binmode(STDOUT, ':utf8'); +binmode(STDERR, ':utf8'); + +my $marc_xml = shift; +my $tag = shift; +my $subfield = shift; +my $evidence = shift; + +$marc_xml =~ s/(.........)./${1}a/; + +eval { + $marc_xml = MARC::Record->new_from_xml($marc_xml); +}; +if ($@) { + #elog("could not parse $bibid: $@\n"); + import MARC::File::XML (BinaryEncoding => 'utf8'); + return $marc_xml; +} + +my @fields = $marc_xml->field($tag); +return $marc_xml->as_xml_record() unless @fields; + +my @fields_to_delete; + +foreach my $f (@fields) { + my $sf = lc($f->as_string($subfield)); + if ($sf =~ m/$evidence/) { push @fields_to_delete, $f; } +} + +$marc_xml->delete_fields(@fields_to_delete); + +return $marc_xml->as_xml_record(); + +$function$; + + -- consolidate marc tag DROP FUNCTION IF EXISTS migration_tools.consolidate_tag(TEXT,TEXT); CREATE OR REPLACE FUNCTION migration_tools.consolidate_tag(marc TEXT, tag TEXT) -- 1.7.2.5