From d51dcd714d248d34dcea52a531f0bafd4b8c0c1f Mon Sep 17 00:00:00 2001 From: Michael Hafen Date: Fri, 4 Jan 2013 17:52:59 -0700 Subject: [PATCH] command-line tool to switch the contents of 440 and 490 tags Content-Type: text/plain; charset="utf-8" With the MARC21 standard moving from the 440 tag to the 490 tag, this tool is to help libraries make the move. It switches any information in 440 tags to 490 tags, and any information in 490 tags to 440 tags. That seemed like the best way to go to me. To Test: locate some biblios with 440 or 490 tags filled. run bin/migration_tools/switch_marc21_series_info.pl observe that the information in the biblios has switched 4xx tags. --- misc/migration_tools/switch_marc21_series_info.pl | 73 +++++++++++++-------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/misc/migration_tools/switch_marc21_series_info.pl b/misc/migration_tools/switch_marc21_series_info.pl index e174224..ac8537d 100755 --- a/misc/migration_tools/switch_marc21_series_info.pl +++ b/misc/migration_tools/switch_marc21_series_info.pl @@ -17,12 +17,12 @@ use C4::Context; my $dbh = C4::Context->dbh; -my $bibs_sth = $dbh->prepare( "SELECT biblionumber FROM biblio CROSS JOIN biblioitems USING (biblionumber) WHERE ( seriestitle <> '' AND seriestitle IS NOT NULL ) OR ( volume <> '' AND volume IS NOT NULL ) OR ( number <> '' AND number IS NOT NULL )" ); +my $bibs_sth = $dbh->prepare( 'SELECT biblionumber FROM biblio CROSS JOIN biblioitems USING (biblionumber) WHERE ExtractValue(marcxml,\'//datafield[@tag="440"]/subfield[@code="a"]\') OR ExtractValue(marcxml,\'//datafield[@tag="440"]/subfield[@code="v"]\') OR ExtractValue(marcxml,\'//datafield[@tag="440"]/subfield[@code="n"]\') OR ExtractValue(marcxml,\'//datafield[@tag="490"]/subfield[@code="a"]\') OR ExtractValue(marcxml,\'//datafield[@tag="490"]/subfield[@code="v"]\')' ); $bibs_sth->execute(); while ( my ( $biblionumber ) = $bibs_sth->fetchrow ) { my $framework = GetFrameworkCode( $biblionumber ) || ''; - my ( $series1, $volume1, $series2, $volume2, $subfield ); + my ( @newfields ); # MARC21 specific my ( $series1_t, $series1_f ) = ( '440', 'a' ); @@ -35,39 +35,54 @@ while ( my ( $biblionumber ) = $bibs_sth->fetchrow ) { # Get biblio marc my $biblio = GetMarcBiblio( $biblionumber ); - my $series2 = $biblio->subfield( $series2_t, $series2_f ); - my $volume2 = $biblio->subfield( $volume2_t, $volume2_f ); + foreach my $field ( $biblio->field( $series1_t ) ) { + my @newsubfields; + my @series1 = $field->subfield( $series1_f ); + my @volume1 = $field->subfield( $volume1_f ); + my @number1 = $field->subfield( $number1_f ); + my $i = 0; + foreach my $num ( @number1 ) { + $volume1[$i] .= " " if ( $volume1[$i] ); + $volume1[$i++] .= $num if ( $num ); + } + + while ( @series1 || @volume1 ) { + if ( @series1 ) { + push @newsubfields, ( $series2_f, shift @series1 ); + } + if ( @volume1 ) { + push @newsubfields, ( $volume2_f, shift @volume1 ); + } + } - my $series1 = $biblio->subfield( $series1_t, $series1_f ); - my $volume1 = $biblio->subfield( $volume1_t, $volume1_f ); - if ( $biblio->subfield( $number1_t, $number1_f ) ) { - $volume1 .= " ". $biblio->subfield( $number1_t, $number1_f ); + my $new_field = MARC::Field->new( $series2_t, '', '', + @newsubfields ); + + $biblio->delete_fields( $field ); + push @newfields, $new_field; } - $subfield = $biblio->subfield( $series1_t ); - if ( $series2 or $volume2 ) { - if ( $subfield ) { - $subfield->update( $series1_f => $series2, $volume1_f => $volume2 ); - } - else { - $subfield = MARC::Field->new( $series1_t, '', '', - $series1_f => $series2, $volume1_f => $volume2 ); - $biblio->append_fields( $subfield ); + foreach my $field ( $biblio->field( $series2_t ) ) { + my @newsubfields; + my @series2 = $field->subfield( $series2_f ); + my @volume2 = $field->subfield( $volume2_f ); + + while ( @series2 || @volume2 ) { + if ( @series2 ) { + push @newsubfields, ( $series1_f, shift @series2 ); + } + if ( @volume2 ) { + push @newsubfields, ( $volume1_f, shift @volume2 ); + } } - } - elsif ( $subfield ) { - $biblio->delete_fields( $subfield ); - } - $subfield = $biblio->subfield( $series2_t ); - unless ( $subfield ) { - $subfield = MARC::Field->new( $series2_t, '', '', - $series2_f => $series1, $volume2_f => $volume1 ); - $biblio->append_fields( $subfield ); - } - else { - $subfield->update( $series2_f => $series1, $volume2_f => $volume1 ); + my $new_field = MARC::Field->new( $series1_t, '', '', + @newsubfields ); + + $biblio->delete_fields( $field ); + push @newfields, $new_field; } + $biblio->insert_fields_ordered( @newfields ); ModBiblioMarc( $biblio, $biblionumber, $framework ); } -- 1.7.10.4