Hello,

I've created two little scripts to convert from BibTeX to MARC and vice
versa. I've attached these scripts with a little BibTeX file.

So, I convert a little bibliography from BibTeX to MARC without any problem.
Unfortunately, when I try to convert my new MARC file to BibTeX, the 'year'
subfield is lost. When I check data with marcdump, I can see all the data I
want, included the year.

When I use Data::Dumper to see the $entry in marc2bib.pl, I can see the
'year' subfield, unfortunately, I can access it via MARC::Record.

Is there something I'm doing wrong ?

Thanks in advance,

Manu
#!/usr/bin/perl -w

use strict;
use warnings;

use Text::BibTeX;
use MARC::Record;
use Getopt::Long;

my $config = { output => 'export_marc.marc', };

my @bibtex_tag
    = qw( author editor title publisher year volume series edition note );

my @marc21_tag = qw( 100$a 100$a 245$a 260$b 260$c 490$v 490$a 250$a 504$a );

my %bib2marc;

@[EMAIL PROTECTED] = @marc21_tag;

GetOptions( $config, 'input=s', 'output=s', 'help=s' );

if ( not exists $config->{input} ) {
    die "Usage: $0 --input file --output file\n";
}
else {
    my $converted = run( $config->{input}, $config->{output} );
}

sub run {
    my ( $input, $output ) = @_;
    my $cpt     = 0;
    my $bibfile = Text::BibTeX::File->new($input);
    open my $marcfile, '>', $output;
    while ( my $entry = Text::BibTeX::Entry->new($bibfile) ) {
        next unless $entry->parse_ok;
        next unless $entry->type eq 'book';
        my $marcrecord = MARC::Record->new();
        map { _process_tag( $_, $entry, $marcrecord ) } @bibtex_tag;
        print $marcfile $marcrecord->as_usmarc();
        $cpt++;
    }
    close $marcfile;
    return $cpt;
}

sub _process_tag {
    my ( $bibtag, $entry, $marcrecord ) = @_;
    if ( $entry->exists($bibtag) ) {
        my ( $tag, $subtag ) = split( '\$', $bib2marc{$bibtag}, 2 );
        my $marcfield = MARC::Field->new( $tag, '', '',
            $subtag => _clean_tex( $entry->get($bibtag) ) );
        $marcrecord->append_fields($marcfield);
    }
}

sub _clean_tex {
    my $text = shift;
    $text =~ s/[\{\}]//g;
    $text =~ s/\\//g;
    $text =~ s/`e/è/g;
    $text =~ s/'e/é/g;
    $text =~ s/^e/ê/g;
    $text =~ s/¨e/ë/g;
    $text =~ s/`a/à/g;
    $text =~ s/^a/â/g;
    $text =~ s/¨a/ä/g;
    $text =~ s/`u/ù/g;
    $text =~ s/^u/û/g;
    $text =~ s/¨u/ü/g;
    $text =~ s/`i/ì/g;
    $text =~ s/^i/î/g;
    $text =~ s/¨i/ï/g;
    return $text;
}

@book{,
  author = {V{\'e}ronique Mesguich and Armelle Thomas},
  title = {Net recherche : Le guide pratique pour mieux trouver 
l{\'}information utile},
  publisher = {ADBS},
  series = {Sciences et Techniques de l{\'}Information}
}

@book{,
  author = {Langworth, Ian and chromatic},
  title = {Perl Testing: A Developer{\'}s Notebook},
  publisher = {O{\'}Reilly}
}

@book{,
  author = {Thomas A. Limoncelli},
  title = {Time Management for System Administrators},
  publisher = {O{\'}Reilly}
}

@book{,
  author = {Bernard Pochet},
  title = {M{\'e}thodologie documentaire : rechercher, consulter, r{\'e}diger 
{\`a} l{\'}heure d{\'}Internet},
  publisher = {De Boeck}
}

@book{,
  author = {Yolla Polity and G{\'e}rard Henneron and Rosalba Palermiti},
  title = {L{\'}Organisation des connaissances : approches conceptuelles},
  publisher = {L{\'}Harmattan}
}

@book{,
  author = {Martine Darrobers and Nicole Le Pottier},
  title = {La Recherche documentaire},
  publisher = {Nathan}
}

@book{,
  author = {Daniel Brown},
  title = {Mastering Information Retrieval and Probabilistic Decision 
Intelligence Technology},
  publisher = {Chandos Publishing}
}

@book{,
  author = {Amanda Spink and Bernard J. Jansen},
  title = {Web Search: Public Search of the Web},
  publisher = {Kluwer Academic Publishers}
}

@book{,
  author = {INRIA},
  title = {La Recherche d{\'}information sur les r{\'e}seaux : Cours INRIA 30 
sept-4oct.2002, Le Bono (Morbihan)},
  publisher = {ADBS}
}

@book{,
  author = {Jamie Whyte},
  title = {Bad Thoughts: A Guide to Clear Thinking},
  publisher = {Corvo Books}
}

@book{,
  author = {Fr{\'e}d{\'e}ric Lenoir and Violette Cabesos},
  title = {La Promesse de l{\'}ange},
  publisher = {Le Livre de Poche}
}

@book{,
  author = {Mark Jason Dominus},
  title = {Higher-Order Perl},
  publisher = {Morgan Kaufmann}
}

@book{,
  author = {chromatic and Damian Conway and Curtis {"}Ovid{"} Poe},
  title = {Perl Hacks},
  publisher = {O{\'}Reilly}
}

#!/usr/bin/perl -w

use strict;
use warnings;

use Text::BibTeX;
use MARC::Record;
use MARC::File::USMARC;
use Getopt::Long;

my $config = { output => 'export_bibtex.bib', };

my @bibtex_tag = qw( author title publisher year volume series edition note );

my @marc21_tag = qw( 100$a 245$a 260$b 260$c 490$v 490$a 250$a 504$a );

my %marc2bib;

@[EMAIL PROTECTED] = @bibtex_tag;

GetOptions( $config, 'input=s', 'output=s', 'help=s' );

if ( not exists $config->{input} ) {
    die "Usage: $0 --input file --output file\n";
}
else {
    my $converted = run( $config->{input}, $config->{output} );
}

sub run {
    my ( $input, $output ) = @_;
    my $cpt      = 0;
    my $marcfile = MARC::File::USMARC->in($input);
    my $bibfile  = Text::BibTeX::File->new( $output, '>' );

    while ( my $entry = $marcfile->next() ) {
        my $bibentry = Text::BibTeX::Entry->new();
        $bibentry->set_type('book');
        $bibentry->set_metatype(BTE_REGULAR);
        $bibentry->set_key('');
        map { _process_tag( $_, $entry, $bibentry ) } @marc21_tag;
        $bibentry->write($bibfile);

        $cpt++;
    }

    return $cpt;
}

sub _process_tag {
    my ( $marctag, $marcrecord, $bibentry ) = @_;
    my ( $tag, $subtag ) = split( '\$', $marctag, 2 );
    my $data = $marcrecord->subfield( $tag, $subtag );

    $bibentry->set( $marc2bib{$marctag}, _clean_tex($data) ) if $data;
}

sub _clean_tex {
    my $text = shift;

    $text =~ s/"/\{"\}/g;
    $text =~ s/'/\{\\'\}/g;
    $text =~ s/è/\{\\`e\}/g;
    $text =~ s/é/\{\\'e\}/g;
    $text =~ s/ê/\{\\^e\}/g;
    $text =~ s/ë/\{\\¨e\}/g;
    $text =~ s/à/\{\\`a\}/g;
    $text =~ s/â/\{\\^a\}/g;
    $text =~ s/ä/\{\\¨a\}/g;
    $text =~ s/ù/\{\\`u\}/g;
    $text =~ s/û/\{\\^u\}/g;
    $text =~ s/ü/\{\\¨u\}/g;
    $text =~ s/ì/\{\\`i\}/g;
    $text =~ s/î/\{\\^i\}/g;
    $text =~ s/ï/\{\\¨i\}/g;
    return $text;
}

Reply via email to