#!/usr/bin/perl # -*- coding: iso-8859-15 -*- ############################################################################### =pod =item B --file foo.mrc Converts a MARC binary file internally to XML and changes 999 subfields to 998s with a special subfield z with a value of 'converted 999 field' added for identification. =back =cut ############################################################################### use strict; use warnings; use Data::Dumper; use Env qw( HOME PGHOST PGPORT PGUSER PGDATABASE MIGSCHEMA MIGBASEWORKDIR MIGBASEGITDIR MIGGITDIR MIGWORKDIR ); use Pod::Usage; use Switch; use Getopt::Long; use MARC::Batch; use MARC::Record; use MARC::Field; use MARC::Batch; use MARC::File::XML; use Cwd 'abs_path'; use Cwd qw(getcwd); use List::MoreUtils qw(uniq); use FindBin; my $mig_bin = "$FindBin::Bin/"; use lib "$FindBin::Bin/"; use KMig; use open ':encoding(utf8)'; binmode STDOUT, ":utf8"; pod2usage(-verbose => 2) if defined $ARGV[0] && $ARGV[0] eq '--help'; pod2usage(-verbose => 1) if ! $ARGV[1]; my $infile; my $i = 0; my $ret = GetOptions( 'file:s' => \$infile ); my $outfile = $infile . '.prepped_xml'; my $errorfile = $infile . '.errors_xml'; open my $outfh, '>:utf8', $outfile or die "Can't open output file $!\n"; open my $errorfh, '>:utf8', $errorfile or die "Can't open error file $!\n"; my $filetype = `file $infile`; my $batch; if ($filetype =~ m/MARC21/) { $batch = MARC::Batch->new( 'USMARC', $infile ); } else { $batch = MARC::Batch->new( 'XML', $infile ); } $batch->strict_off(); while ( eval {$record = $batch->next()} or do { if ($@) { print $errorfh $record->as_xml(); next; } } ) { $i++; print "Processed: $i\n" if ($i % 100) == 0; my @nnn = $record->field('999'); foreach my $n (@nnn) { $n->set_tag('998'); $n->add_subfields( 'z' => 'converted 999 field' ); } print $outfh $record->as_xml(),"\n"; } close ($infile); close ($outfile); close ($errorfile); ########### functions sub abort { my $msg = shift; print STDERR "$0: $msg", "\n"; exit 1; }