my $source = shift @ARGV || die "usage: $0 file.m21\n";
my $dest = $source;
-$dest =~ s/\..+/.marc/;
+$dest .= '.iso';
-open(my $m21, '<', $source);
+close(STDERR) unless $ENV{DEBUG};
+
+open(my $m21, '<:encoding(utf-8)', $source);
open(my $out, '>:encoding(utf-8)', $dest);
warn "# convert $source => $dest\n";
while (<$m21>) {
chomp;
+ s/\xC2\x98/<</g;
+ s/\xC2\x9C/>>/g;
+ s/\x98/<</g;
+ s/\x9C/>>/g;
my ( $id, $rest ) = split(/\s/, $_, 2);
my ( $fffii, $sf ) = split(/\s+L\s+/,$rest,2);
$sf =~ s/\^/ /g;
$marc->leader( $sf );
} elsif ( $fffii =~ m/^00/ ) {
+ warn "# $id clean $fffii" if $fffii =~ s/[a-z]//g;
my $field = MARC::Field->new( $fffii, $sf );
$marc->append_fields( $field );
} else {
my @f = ( $f, $i1, $i2 );
while ( $sf =~ s/^\$\$(\w)([^\$]+)// ) {
- push @f, $1, decode('iso-8859-1', $2);
+# push @f, $1, decode('iso-8859-1', $2);
+ push @f, $1, $2;
}
warn "### ",dump( @f );
- my $field = MARC::Field->new( @f );
+ my $field;
+again:
+ eval { $field = MARC::Field->new( @f ) };
+ if ( $@ ) {
+ if ( $@ =~ m/must have indicators/ ) {
+ push @f, ' ', ' ';
+ goto again;
+ }
+ die $@;
+ }
$marc->append_fields( $field );
}
}