]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/extras/import/marc_add_ids
Merge branch 'master' of git.evergreen-ils.org:Evergreen-DocBook into doc_consolidati...
[Evergreen.git] / Open-ILS / src / extras / import / marc_add_ids
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Getopt::Long;
7 use MARC::Record;
8 use MARC::Charset;
9 use MARC::File::XML (BinaryEncoding => 'UTF-8');
10 use Error qw/:try/;
11
12 MARC::Charset->assume_unicode(1);
13 MARC::Charset->ignore_errors(1);
14
15 binmode(STDIN, ':utf8');
16 binmode(STDOUT, ':utf8');
17
18 $| = 1;
19
20 my ($delim, @fields) = (' \| ');
21 my $quiet = 0;
22 my $set_001_003 = 0;
23 my $repository_code = 'Evergreen';
24 my $set_as_deleted = 0;
25 GetOptions(
26         'quiet' => \$quiet,
27         'delimiter=s'   => \$delim,
28         'field=s'       => \@fields,
29     'set_001_003'   => \$set_001_003,
30     'repository_code=s'   => \$repository_code,
31     'set_as_deleted'   => \$set_as_deleted,
32 );
33
34 my %partmap;
35 my $partcount = 0;
36 for (@fields) {
37         $partmap{$_} = $partcount;
38         $partcount++;
39 }
40
41 print '<collection xmlns="http://www.loc.gov/MARC21/slim">';
42
43 my $count = 0;
44 while (<>) {
45         chomp;
46         my @values = split $delim;
47
48         my %partlist;
49         for my $part (keys %partmap) {
50                 ($partlist{tcn_value} = $values[ $partmap{tcn_value}]) =~ s/^\s*//o if ($part eq 'tcn_value');
51                 ($partlist{tcn_source} = $values[ $partmap{tcn_source}]) =~ s/^\s*//o if ($part eq 'tcn_source');
52                 ($partlist{id} = $values[ $partmap{id}]) =~ s/^\s*//o if ($part eq 'id');
53                 ($partlist{deleted} = $values[ $partmap{deleted}]) =~ s/^\s*//o if ($part eq 'deleted');
54                 $partlist{marc} = $values[ $partmap{marc}] if ($part eq 'marc');
55
56                 $partlist{tcn_value} =~ s/\s*$//o if ($part eq 'tcn_value');
57                 $partlist{tcn_source} =~ s/\s*$//o if ($part eq 'tcn_source');
58                 $partlist{id} =~ s/\s*$//o if ($part eq 'id');
59         }
60
61         next unless ($partlist{marc});
62     next unless ($partlist{id} =~ /^\d+$/);
63     $partlist{marc} =~ s/<(\/?)marc:/<$1/go;
64
65         try {
66                 my $r = MARC::Record->new_from_xml($partlist{marc});
67
68
69         # XXX the following wil likely be subsumed by an in-db process, as the 901 was
70         if ($set_001_003) {
71             my $old_001 = $r->field('001');
72             if ($old_001) {
73                 $old_001->update($partlist{id});
74             } else {
75                 my $new_001 = new MARC::Field('001',$partlist{id});
76                 $r->insert_fields_ordered($new_001);
77             } 
78             my $old_003 = $r->field('003');
79             if ($old_003) {
80                 $old_003->update($repository_code);
81             } else {
82                 my $new_003 = new MARC::Field('003',$repository_code);
83                 $r->insert_fields_ordered($new_003);
84             } 
85         }
86
87         if ($set_as_deleted && $partlist{deleted} eq 't') {
88             my $leader = $r->leader();
89             if (length($leader)>4) {
90                 substr($leader,5,1,"d");
91                 $r->leader($leader);
92             }
93         }
94
95                 my $x = $r->as_xml_record;
96         $x =~ s/\n//gso;
97         $x =~ s/^<[^>]>//o;
98         print $x."\n";
99         $count++;
100         print STDERR "\r$count" unless ($quiet || $count % 100);
101
102         } otherwise {
103                 warn "failed on record $., $partlist{marc}, for $@\n" if (!$quiet);
104                 import MARC::File::XML; # reset SAX parser
105         };
106 }
107
108 print '</collection>';
109