#!/usr/bin/perl use strict; use warnings; use Getopt::Long; use MARC::Record; use MARC::Charset; use MARC::File::XML; use Error qw/:try/; MARC::Charset->assume_unicode(1); MARC::Charset->ignore_errors(1); binmode(STDIN, ':utf8'); binmode(STDOUT, ':utf8'); my ($delim, @fields) = (' \| '); GetOptions( 'delimiter=s' => \$delim, 'field=s' => \@fields, ); my %partmap; my $partcount = 0; for (@fields) { $partmap{$_} = $partcount; $partcount++; } while (<>) { chomp; my @values = split $delim; my %partlist; for my $part (keys %partmap) { ($partlist{tcn_value} = $values[ $partmap{tcn_value}]) =~ s/^\s*//o if ($part eq 'tcn_value'); ($partlist{tcn_source} = $values[ $partmap{tcn_source}]) =~ s/^\s*//o if ($part eq 'tcn_source'); ($partlist{id} = $values[ $partmap{id}]) =~ s/^\s*//o if ($part eq 'id'); $partlist{marc} = $values[ $partmap{marc}] if ($part eq 'marc'); $partlist{tcn_value} =~ s/\s*$//o if ($part eq 'tcn_value'); $partlist{tcn_source} =~ s/\s*$//o if ($part eq 'tcn_source'); $partlist{id} =~ s/\s*$//o if ($part eq 'id'); } next unless ($partlist{marc}); try { my $r = MARC::Record->new_from_xml($partlist{marc}); my %sfmap; $sfmap{a} = $partlist{tcn_value} if ($partlist{tcn_value}); $sfmap{b} = $partlist{tcn_source} if ($partlist{tcn_source}); $sfmap{c} = $partlist{id} if ($partlist{id}); my $f = MARC::Field->new(901 => ' ' => ' ' => %sfmap); $r->delete_field($_) for ($r->field('901')); $r->append_fields( $f ); print $r->as_xml_record; } otherwise { warn "failed on record $., $partlist{marc}\n"; }; }