Revision 1322 (by dpavlin, 2010/01/26 14:16:36) Merge remote branch 'remotes/Sack'

Conflicts:
bin/dump2marc.pl
#!/usr/bin/perl

# Convert marcdump output back to marc file

use warnings;
use strict;

use MARC::Record;
use Data::Dump qw(dump);
use Encode;

my $debug = 0;
my @fields;

sub parse_subfields {
	my $text = shift;
	if ( $text =~ /^_([a-z])(.+)$/ ) {
		return ( $1, $2 );
	} else {
		$text =~ s/^ // || warn "no space in front of: '$text'\n";
		return $text;
	}
}

my $leader;

while(<>) {
	chomp;
	$_ = decode('utf-8', $_);

	if ( /^LDR (.+)$/ ) {
		$leader = $1;
	} elsif ( /^(\d\d\d) (.)(.) (.+)$/ ) {
		if ( $1 < 10 ) {
			push @fields, [ $1, parse_subfields($4) ];
		} else {
			push @fields, [ $1, $2, $3, parse_subfields($4) ];
		}
	} elsif ( /^\s{7}_([a-z])(.+)$/ ) {
		push @{ $fields[ $#fields ] }, $1, $2;
	} elsif ( /^$/ ) {
		warn dump( @fields ) if $debug;

		my $marc = new MARC::Record;
		$marc->encoding( 'utf-8' );
		$marc->leader( $leader );
		$marc->add_fields( @fields );

		warn $marc->as_formatted, $/, $/;
		print $marc->as_usmarc;

		@fields = ();
	} else {
		warn "IGNORED: $_\n" if $debug;
	}

}