unimarc to marc21
[webpac2] / scripts / aleph2iso.pl
index 9dd4b68..45e72e2 100755 (executable)
@@ -8,9 +8,11 @@ use Data::Dump qw(dump);
 
 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";
@@ -29,6 +31,10 @@ $marc = new_marc();
 
 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);
 
@@ -48,6 +54,7 @@ while (<$m21>) {
                $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 {
@@ -62,10 +69,20 @@ while (<$m21>) {
                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 );
        }
 }