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
NBIBTEX(1)						      General Commands Manual							NBIBTEX(1)

NAME
nbibtex - make a bibliography for LaTeX SYNOPSIS
nbibtex [options] auxname[.aux] [bibname...] DESCRIPTION
NbibTeX is a drop-in replacement for BibTeX. It reads the top-level auxiliary (.aux) file that was output during the running of latex(1) or tex(1) and creates a bibliography (.bbl) file that will be incorporated into the document on subsequent runs of LaTeX or TeX. NbibTeX looks up, in bibliographic database (.bib) files specified by the ibliography command, the entries specified by the cite and ocite commands in the LaTeX or TeX source file. The association of cite command with .bib entry is made by a simple query language described below. NbibTeX formats the information from the .bib entries according to instructions in a bibliography style (.nbs) file (specified by the ibliographystyle command, and it outputs the results to the .bbl file. If the optional bibnames are used, NbibTeX looks in the named bibliographies instead of those specified by the ibliography command. A bibname without a slash (/) character means the same thing it would mean in a ibliographystyle command: it is looked up according to the rules of BibTeX. A bibname with a slash character is taken to be the absolute or relative pathname of a .bib file. Explicit bibnames can be used with the -bib and -o options to make a paper-specific .bib file from larger .bib files. The LaTeX manual explains what a LaTeX source file must contain to work with NbibTeX. Appendix B of the manual describes the format of the .bib files. The `NbibTeXing' document describes extensions and details of this format, and it gives other useful hints for using NbibTeX. OPTIONS
-min-crossrefs=number The -min-crossrefs option defines the minimum number of crossref required for automatic inclusion of the crossref'd entry on the citation list; the default is 2. -terse Accepted for backward compatibility with BibTeX; NbibTeX is terse by default. -permissive Enables NbibTeX to continue working even when some of the .bib files mentioned in the ibliography command are missing. Also tells NbibTeX not to object if duplicate entries are found in multiple .bib files. -strict Tells NbibTeX to complain about all irregularities it spots in any .bib file it parses. By default, NbibTeX (like BibTeX) com- plains only about entries it actually intends to use. -o file Writes the bibliography to file instead of to the default auxname.bbl. If file is -, writes to standard output. -bib Instead of writing a bibliography for use by LaTeX, writes exactly those NbibTeX entries needed by auxname. Useful for making paper-specific .bib files. -help Emit a short help message and exit. -version Emit version information and exit. EXAMPLES
To make a normal bibliography for file paper.tex: nbibtex paper b To use the personal .bib file personal.bib to make a paper-specific bibliography for file paper.tex, which should use the command logra- phy{paper}: nbibtex -o paper.bib -bib paper personal The file personal.bib should be found on the usual BIBINPUTS path. To extend the bibliography paper.bib by filling in missing entries from personal.bib: nbibtex -permissive -o paper.bib -bib paper paper personal QUERY LANGUAGE
To specify a paper you wish to cite, classic BibTeX requires an arbitrary key. The advantage of NbibTeX is that you cite a paper by the contents of the NbibTeX entry. The citation consists of a sequence of one or more constraints separated by colons. A constraint may be empty. A nonempty constraint is of the form key=words, where key is the name of a field in the NbibTeX entry and words is a sequence of one or more words separated by dashes. The contraint is satisfied if every word in words is found in the field named by key. (The key may also be [type], which matches agains the type of the entry, or *, which looks for words in any field.) For example, the following queries might match an entry for a useful source on arithmetic: author=knuth:series=art-programming:volume=2 author=knuth:title=seminumerical:year=1981 As a convenience, keys may be defaulted in up to three constraints. In the first constraint, the default key is author (or if there is no author, editor). In the second constraint, the default key is year if words is all digits, and is title otherwise. In the third con- straint, the default key is year if words is all digits, and is [type] otherwise. So for example, we could have written knuth:seminumerical:1981 To match a word in words, BX uses the Boyer-Moore string-matching algorithm, so longer words are usually faster. NbibTeX's query language can be used on the command line by nbibfind(1). NBIBTEX STYLES AND COMPATIBILITY WITH BibTeX Like BibTeX, NbibTeX supports a variety of "styles" of bibliography. Each style is defined by a program written in Lua, using additional primitives suitable to construction of bibliographies. NbibTeX provides the three standard styles in a form suitable for use with the nat- bib package. Two of these styles (abbrvnat and unsrtnat) are completely compatible with the corresponding BibTeX styles; the third style (plainnat) has been changed to more closely follow the Chicago Manual of Style. A compatible version is available as style plainnatc. Additional styles may be created by writing new Lua code; for example, an author wishing to create a style called mcbride would put a file called mcbride.nbs (for New BibTeX Style) in the directory /usr/share/nbibtex. For guidance on what goes into such a file, consult the other files in that directory and the literate source code for NbibTeX. ENVIRONMENT
For .bib files, NbibTeX searches the directories in the path defined by the BIBINPUTS environment variable if that is set, otherwise the default. For details of the searching, see tex(1) and kpsewhich(1). No special searching is done for the .aux file. FILES
/usr/share/nbibtex/*.nbs New bibliography style files. BUGS
Although I have made some effort in this direction, compatibility with BibTeX does not extend to .bib files containing non-ASCII charac- ters. SEE ALSO
nbibfind(1), latex(1), tex(1), kpsewhich(1), bibtex(1). Leslie Lamport, LaTeX - A Document Preparation System, Addison-Wesley, 1985, ISBN 0-201-15790-X. The NbibTeX home page at http://www.eecs.harvard.edu/~nr/nbibtex. The Lua home page at http://www.lua.org. AUTHOR
Norman Ramsey, Harvard University. 15 May 2006 NBIBTEX(1)
All times are GMT -4. The time now is 02:14 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy