From adcd71916637bf6b3db24e3ad7599e26472de096 Mon Sep 17 00:00:00 2001 From: Rogan Hamby Date: Mon, 8 Jun 2020 12:17:59 -0400 Subject: [PATCH] adding a strip subfield function --- sql/base/01-marc.sql | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 44 insertions(+), 0 deletions(-) diff --git a/sql/base/01-marc.sql b/sql/base/01-marc.sql index 074ec42..483d8d4 100644 --- a/sql/base/01-marc.sql +++ b/sql/base/01-marc.sql @@ -1,3 +1,47 @@ +DROP FUNCTION IF EXISTS migration_tools.strip_subfield(TEXT,CHAR(3),CHAR(1)); +CREATE OR REPLACE FUNCTION migration_tools.strip_subfield(marc TEXT, tag CHAR(3), subfield CHAR(1)) + 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; +$marc_xml =~ s/(.........)./${1}a/; + +eval { + $marc_xml = MARC::Record->new_from_xml($marc_xml); +}; +if ($@) { + #elog("could not parse: $@\n"); + import MARC::File::XML (BinaryEncoding => 'utf8'); + return $marc_xml; +} + +my @fields = $marc_xml->field($tag); +return $marc_xml->as_xml_record() unless @fields; + +$marc_xml->delete_fields(@fields); + +foreach my $f (@fields) { + $f->delete_subfield(code => '0'); +} +$marc_xml->insert_fields_ordered(@fields); + +return $marc_xml->as_xml_record(); + +$function$; + + CREATE OR REPLACE FUNCTION migration_tools.set_leader (TEXT, INT, TEXT) RETURNS TEXT AS $$ my ($marcxml, $pos, $value) = @_; -- 1.7.2.5