my $data;
+sub vc_casefix { # partial reverse-engeenered implementation of case mapping
+ my ( $tag, $sfi, $vc, $k, $rest ) = @_;
+
+ $vc .= " " x (4 - length($vc));
+
+ $k =~ tr/^~]}\\|[{@`/ČčĆćĐ𩹮ž/; # CROASCII (YUS|HRN) B1.002:1982
+
+ my @m = map { ord($_) } split(//, $vc);
+
+ my $mask = ( $m[3] & 0b00001111 ) << 4 | ( $m[2] & 0b00001111 );
+
+ my $sel = 0b10000000;
+ my $fixed;
+ my @chars = split(//, $k);
+ foreach my $c ( @chars ) {
+ die "key [$k]" unless defined $c;
+ $fixed .= $mask & $sel ? uc($c) : lc($c);
+ $sel >>= 1;
+ }
+
+ if ( substr($vc,0,1) eq 'x' || ( $tag =~ m/^(200|210|225|700|701|702|710|711|712)$/ ) ) { #&& $sfi eq '$a' )) {
+ $fixed = ucfirst $fixed;
+ }
+
+ if ( $rest && length($fixed) < 8 ) {
+# warn "# padding $fixed|$rest";
+ $fixed .= " " x ( 8 - length($fixed) );
+ }
+
+ return $fixed . $rest;
+}
+
sub csv_file {
my ($file,$parse) = @_;
print STDERR "# reading $file ";
my $lines = 1;
- open(my $fh, '<', $file);
+ open(my $fh, '<:encoding(UTF-8)', $file);
my $h = <$fh>; # header
while(<$fh>) {
chomp;
+
+# tr/^~]}\\|[{@`/ČčĆćĐ𩹮ž/; # CROASCII (YUS|HRN) B1.002:1982
+
my ( $idsl, $tag, $tagno, $id, $sfi, $sfino, $text ) = $parse->($_);
$lines++;
print STDERR "\n";
}
-csv_file( 'TEKTAG.csv', sub {
+csv_file( 'tsv/TEKTAG.csv', sub {
my $line = shift;
- my ( $idsl, $tag, $tagno, $id, $sfi, $sfino, $textkey, $textres ) = split(/,/,$_);
+ my ( $idsl, $tag, $tagno, $id, $sfi, $sfino, $textkey, $textres, $vc ) = split(/\t/,$_);
- my $text = $textkey . $textres; # FIXME fix CAPITAL letters in $textkey
+ my $text = vc_casefix( $tag, $sfi, $vc, $textkey, $textres );
return ( $idsl, $tag, $tagno, $id, $sfi, $sfino, $text );
});
-csv_file( 'LONTAG.csv', sub {
+csv_file( 'tsv/NUMTAG.csv', sub {
+ my $line = shift;
+
+ my ( $IDSL, $TAG, $TAGNO, $ID, $SFI, $SFINO, $LTAG, $LTAGNO, $LID, $LSFI, $TXKEY, $TXRES, $VC, $STOPW ) = split(/\t/,$_);
+
+ my $text = vc_casefix( $TAG, $SFI, $VC, $TXKEY, $TXRES );
+
+ return ( $IDSL, $TAG, $TAGNO, $ID, $SFI, $SFINO, $text );
+});
+
+csv_file( 'tsv/LONTAG.csv', sub {
my $line = shift;
- my ( $idsl, $tag, $tagno, $id, $sfi, $sfino, $text ) = split(/;/,$_, 7);
+ my ( $idsl, $tag, $tagno, $id, $sfi, $sfino, $text ) = split(/\t/,$_, 7);
- $text =~ s/;+$//;
- $text =~ s/;/\n/g; # join OPIS[1-11]
+ $text =~ s/\t+$//;
+ $text =~ s/\t/\n/g; # join OPIS[1-11]
return ( $idsl, $tag, $tagno, $id, $sfi, $sfino, $text );
});
-csv_file( 'IDNTAG.csv', sub {
+csv_file( 'tsv/IDNTAG.csv', sub {
my $line = shift;
- my ( $idsl, $tag, $STSL, $KZVS, $BIBRAZ, $HIRAZ, $KPS, $OKO ) = split(/,/,$_);
+ my ( $idsl, $tag, $STSL, $KZVS, $BIBRAZ, $HIRAZ, $KPS, $OKO ) = split(/\t/,$_);
my @leader;
$leader[5] = $STSL;
return;
});
-csv_file( 'OBRTAG.csv', sub {
+csv_file( 'tsv/OBRTAG.csv', sub {
my $line = shift;
- my ( $IDSL, $TAG, $TAGNO, $ID, $SFI, $SFINO, $CODINF ) = split(/,/,$_);
+ my ( $IDSL, $TAG, $TAGNO, $ID, $SFI, $SFINO, $CODINF ) = split(/\t/,$_);
return ( $IDSL, $TAG, $TAGNO, $ID, $SFI, $SFINO, $CODINF );
});
print STDERR "\n# getting all ids ";
-my @ids = keys %$data;
+my @ids = sort keys %$data;
print STDERR scalar(@ids), " found\n";
my $marc_file = 'liberated.marc';
foreach my $id ( @ids ) {
my $rec = MARC::Record->new;
$rec->encoding( 'UTF-8' );
+ $rec->add_fields( [ '001', $id ] );
+
foreach my $field ( sort keys %{ $data->{$id} } ) {
if ( $field eq 'leader' ) {
$rec->leader( $data->{$id}->{$field} );
}
foreach my $arr ( @{ $data->{$id}->{$field} } ) {
if ( ! $arr ) {
- print STDERR "SKIPPED $id $field ",dump( $data->{$id}->{$field} ), "\n";
+# print STDERR "SKIPPED $id $field ",dump( $data->{$id}->{$field} ), "\n";
next;
}
+ $arr = [ $arr->[3] ] if ( $field < 010 ); # control fields don't have idicators or subfields
$rec->add_fields( $field, @$arr );
}
}