6799778c598addaf57f207891008294dca632f47
[eprints3-migration.git] / tsv2xp-xml.pl
1 #!/usr/bin/perl
2
3 # ./tsv2xp-xml.pl 2>/dev/null > ep-diplomski.xml
4 # sudo -u eprints /usr/share/eprints3/bin/import --verbose --migration ffzg eprint XML ep-diplomski.xml
5
6 use warnings;
7 use strict;
8
9 use File::Slurp;
10 use Data::Dump qw(dump);
11
12 my $tsv_file = ( glob 'items.*' )[0];
13
14 my $xml = read_file 'ep-xml.xml';
15 my @files = read_file "files.txt";
16
17 my $file2path;
18 foreach my $full ( @files ) {
19         chomp $full;
20         my $file = $1 if $full =~ m{/([^/]+)$};
21         $file =~ s/\.\w+$//;
22         $file2path->{ lc $file } = $full;
23 }
24 #warn "# file2path ",dump($file2path);
25
26 print qq{<?xml version="1.0" encoding="utf-8" ?>
27 <eprints>
28 };
29
30 my @header;
31 my $header2col;
32 my $col = 0;
33
34 our @v;
35 sub interpolate {
36         my $f = shift;
37         my $optional = $1 if $f =~ s{(\?)$}{};
38         my $i = $header2col->{$f};
39         die "no $f in ", dump( $header2col ) if not defined $i and not $optional;
40         my $v = $v[$i];
41         warn "# $f $i = $v\n";
42         return $v;
43 }
44
45
46 open(my $tsv, '<', $tsv_file) || die "$tsv_file: $!";
47 while(<$tsv>) {
48         chomp;
49         if ( m/#(.+)/ ) {
50                 @header = split(/\t/, $1);
51                 warn "# header ",dump( @header );
52                 my $i = 0;
53                 $header2col->{$_} = $col++ foreach @header;
54                 warn "# header2col ",dump( $header2col );
55                 next;
56         }
57
58         @v = map { s/\\N//g; $_ } split(/\t/, $_);
59         warn "# v = ", dump(@v);
60
61         my $file = interpolate 'IME FILE-a';
62         $file =~ s/ //g;
63         my $full_path;
64         if ( my $full = $file2path->{ lc $file } ) {
65                 $full_path = $full;
66                 warn "# file $file -> $full_path\n";
67                 $file .= $1 if $full_path =~ m/(\.\w+)$/;
68         }
69
70         my $subject;
71         if ( $file =~ m/(\w+)/ ) {
72                 $_ = $1;
73                 $subject =
74                         m/bib/i    ? 'IZBIB' :
75                         m/in[fo]/i ? 'IZDHI' :
76                         m/muz/i    ? 'IZMUZ' :
77                         m/arh/i    ? 'IZARH' :
78                         die "unknown subject: $2";
79         }
80
81         my $c = $col;
82         $header2col->{'file'} = $c; $v[$c++] = $file;
83         $header2col->{'full_path'} = $c; $v[$c++] = $full_path;
84         $header2col->{'subject'} = $c; $v[$c++] = $subject;
85
86         my $eprints = $xml;
87         while ( $eprints =~ s/<!-- "(.+?)" -->/interpolate($1)/seg ) {
88                 warn "# replaced $1\n";
89         }
90
91         $eprints =~ s{<documents>.+</documents>}{<!-- no documents -->}s if ! $full_path;
92         $eprints =~ s{<subjects>.+</subjects>}{<!-- no subjects -->}s if ! $subject;
93
94         print $eprints;
95 }
96
97 print qq{
98 </eprints>
99 };
100