Sponsored Content
Top Forums Shell Programming and Scripting Dynamically parse BibTeX and create hash of hash Post 302740963 by wakatana on Friday 7th of December 2012 08:51:49 AM
Old 12-07-2012
Dynamically parse BibTeX and create hash of hash

Hello gurus, Iam trying to parse following BibTex file (bibliography.bib):

Code:
@book{Lee2000a,
abstract = {Abstract goes here},
author = {Lee, Wenke and Stolfo, Salvatore J},
title = {{Data mining approaches for intrusion detection}},
year = {2000}
}
@article{Forrest1996,
abstract = {Abstract goes here},
author = {Forrest, Stephanie and Hofmeyr, Steven A. and Anil, Somayaji},
title = {{Computer immunology}},
year = {1996}
}

I am using BibTeX-Parser for this which works as expected, problem that I have is with creating hash of hash array. Following code:

Code:
#!/usr/bin/perl
# http://search.cpan.org/~gerhard/BibTeX-Parser-0.62/lib/BibTeX/Parser.pm
use BibTeX::Parser;
use IO::File;
use Data::Dumper;
use strict;
use warnings;

my $filename="bibliography.bib";
my (%bibliography, %article);
my $i;
my ($entry, @entries, $type, $key);
my (my $hkey, my $hvalue);

# open BibTeX
my $fh = IO::File->new("$filename") or die "could not open $filename: $!\n";

# create parser object ...
my $parser = BibTeX::Parser->new($fh);
    
# ... and iterate over entries
while ($entry = $parser->next ) {
  if ($entry->parse_ok) {
  
    # return BibTeX elements like abstract, author, title ...
    @entries = $entry->fieldlist();
    
    # create %article as a hash array e.g. year -> 1996; isbn -> 1581138709 etc.
    foreach (@entries) {
      $article{"$_"} = $entry->field("$_");
    }
    
    # return article's key (Lee2000a, Forrest1996)
    $key = $entry->key;
    
    # append %article into %bibliography with approporiate key
    $bibliography{"$key"} = \%article;
    
    #Debug
    #print $entry->key, "\n";
    #print Dumper (\%article);

    # removes all elements of %article (prepare for next iteration)
    %article = ();
    
    #Debug
    #print "================================\n";
  }
  
  else {
    warn "Error parsing file: " . $entry->error;
 }
}

    #Debug
    #print Dumper (\%bibliography);

CURRENT output of Dumper (\%bibliography);
Code:
$VAR1 = {
          'Lee2000a' => {},
          'Forrest1996' => $VAR1->{'Lee2000a'}
        };

EXPECTED output of Dumper (\%bibliography);
Code:
$VAR1 = {
          'Lee2000a' => {
                'abstract' => 'Abstract goes here',
                'author' => 'Lee, Wenke and Stolfo, Salvatore J'
                'title' => 'Data mining approaches for intrusion detection'
                'year' => '2000'
              },
          'Forrest1996' => {
                'abstract' => 'Abstract goes here',
                'author' => 'Forrest, Stephanie and Hofmeyr, Steven A. and Anil, Somayaji'
                'title' => 'Computer immunology'
                'year' => '1996'
                }
        };

What I am doing Wrong ? Many thanks.
 

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to set dynamically keys names in perl %hash

hello I have loop , in this loop im picking names , this names I want to be keys in %hash but I don't know how to set in every loop entertain different key in the %hash (1 Reply)
Discussion started by: umen
1 Replies

2. Shell Programming and Scripting

How to create md5 Hash variable?

I have a script that runs the grub-md5-crypt command based on whether the pass_value variable is a non-zero string. The md5 hash is being created in the /opt/hostconfigs/$HOST file, but I can't echo $md5_value. It is blank. Is there a way to create and echo a md5 hash variable? if then... (1 Reply)
Discussion started by: cstovall
1 Replies

3. Shell Programming and Scripting

Print Entire hash list (hash of hashes)

I have a script with dynamic hash of hashes , and I want to print the entire hash (with all other hashes). Itried to do it recursively by checking if the current key is a hash and if yes call the current function again with refference to the sub hash. Most of the printing seems to be OK but in... (1 Reply)
Discussion started by: Alalush
1 Replies

4. Shell Programming and Scripting

parse csv file, sha1 hash and output

I have a file, not really a csv, but containing delineated data just the same. Lets call that file "raw_data.txt". It contains data in the format of company name:fein number like this: first company name:123456789 second company name:987654321 what i need to do is read this file, apply... (11 Replies)
Discussion started by: FreddyG
11 Replies

5. Shell Programming and Scripting

Assigning a hash to another hash key

Hello, I have a hash in hsh. I need to assign it to another hash globalHsh. I think the below statement does not work $globalHsh{$id} = %hsh; What is the right way to assign it? Thanks (3 Replies)
Discussion started by: rsanjay
3 Replies

6. Shell Programming and Scripting

Perl Hash:Can not keep hash data in the same order that it was inserted

Can Someone explain me why even using Tie::IxHash I can not get the output data in the same order that it was inserted? See code below. #!/usr/bin/perl use warnings; use Tie::IxHash; use strict; tie (my %programs, "Tie::IxHash"); while (my $line = <DATA>) { chomp $line; my(... (1 Reply)
Discussion started by: jgfcoimbra
1 Replies

7. Shell Programming and Scripting

How to create hash dynamically in perl?

Hi, I have one file name file.txt It has the following contents: #File Contents StartTime,EndTime,COUNTER1,COUNTER2,COUNTER3 12:13,12:14,0,1,0 The output should be like this: StartTime: 12:13 ENDTIME: 12:14 (2 Replies)
Discussion started by: vanitham
2 Replies

8. Shell Programming and Scripting

perl hash - using a range as a hash key.

Hi, In Perl, is it possible to use a range of numbers with '..' as a key in a hash? Something in like: %hash = ( '768..1536' => '1G', '1537..2560' => '2G' ); That is, the range operation is evaluated, and all members of the range are... (3 Replies)
Discussion started by: dsw
3 Replies

9. Shell Programming and Scripting

Compare values of hashes of hash for n number of hash in perl without sorting.

Hi, I have an hashes of hash, where hash is dynamic, it can be n number of hash. i need to compare data_count values of all . my %result ( $abc => { 'data_count' => '10', 'ID' => 'ABC122', } $def => { 'data_count' => '20', 'ID' => 'defASe', ... (1 Reply)
Discussion started by: asak
1 Replies

10. Shell Programming and Scripting

Need to print hash of hash in table format

Hi, I have a hash of hash where it has name, activities and count i have data like this - $result->{$name}->{$activities} = $value; content of that are - name - robert tom cat peter activities - running, eating, sleeping , drinking, work i need to print output as below ... (3 Replies)
Discussion started by: asak
3 Replies
BIB2BIB(1)						      General Commands Manual							BIB2BIB(1)

NAME
BibX2bib - Filter BibTeX data bases SYNOPSIS
bib2bib [options] <filename> ... DESCRIPTION
bib2bib is a filter tool that reads one or several bibliography files, filters the entries with respect to a given criterion, and outputs the list of selected keys together with a new bibliography file containing only the selected entries. If no input file is given then input is taken from the standard input. Additionally, bib2bib may output a file containing all the keys of entries that satisfy the condition. This second file is suitable for input as option -citefile to bibtex2html OPTIONS
-ob filename specify the filename where the selected entries are output. If not given, it defaults to standard output. -oc filename specify the filename where the list of selected keys is output. If not given, this file is not created. -c condition specify a condition for selecting the entries. The output will retain only the entries that satisfy this condition. If several such condition are given, then only the entries that satisfy all the conditions are selected. The syntax of conditions is described in the complete documentation, notice that it is better to escape shell expansions in that conditions, in other words, you should write conditions between quotes. -expand expand all abbreviations in the output file. Notice that there is no way to ask for expansion of cross-references, since the meaning of such an expansion is unclear: it's better to let bibtex (via bibtex2html) handle the cross-references himself, depending on the style considered. -s field sorts the entries of the bibliography with respect to the given field, which may be $key or $type to refer to the key or to the entry type, as for filter conditions. This options may be used several times to specifiy a lexicographic order, such as by year, then by keys. When the field is $date then entries are sorted chronologically. When sorting, the resulting bibliography will always contain the comments first, then the preambles, then the abbreviations, and finally the regular entries. Be warned that such a sort may put cross-references before entries that refer to them, so be cautious. -r reverses the sort -q , --quiet be quiet. -w , --warn-error stop at the first warning. USAGE WITH BIBTEX2HTML Notice that the two output files are suitable for use with bibtex2html. A typical use would be bib2bib -oc citefile -ob bibfile.bib -c condition file1.bib file2.bib ... bibtex2html -citefile citefile bibfile.bib which will produce exactly the HTML file for the selected references. Notice finally that bibtex2html will expand the strings (by default, unless you specify the -noexpand option) but not the cross-references. AUTHOR
Bib2bib has been written by Jean-Christophe Filliatre and Claude Marche. This manpage has been compiled by Ralf Treinen from the original bib2bib documentation. SEE ALSO
bibtex2html(1),bibtex(1),hevea(1) http://www.lri.fr/~filliatr/bibtex2html/ For complete documentation, please check the bibtex2html manual. On a Debian system the manual can be found at /usr/share/doc/bibtex2html both in the formats postscript and HTML, or via the Debian help system. BIB2BIB(1)
All times are GMT -4. The time now is 08:02 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy