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
bibtex(n)							      bibtex								 bibtex(n)

__________________________________________________________________________________________________________________________________________________

NAME
bibtex - Parse bibtex files SYNOPSIS
package require Tcl 8.4 package require bibtex ?0.5? ::bibtex::parse ?options? ?text? ::bibtex::parse text ::bibtex::parse ?-command cmd? -channel chan ::bibtex::parse ?-recordcommand recordcmd? ?-preamblecommand preamblecmd? ?-stringcommand stringcmd? ?-commentcommand commentcmd? ?-progresscommand progresscmd? (text | -channel chan) ::bibtex::wait token ::bibtex::destroy token ::bibtex::addStrings token stringdict _________________________________________________________________ DESCRIPTION
This package provides commands for the parsing of bibliographies in BibTeX format. ::bibtex::parse ?options? ?text? This is the general form of the command for parsing a bibliography. Depending on the options used to invoke it it will either return a token for the parser, or the parsed entries of the input bibliography. Instead of performing an immediate parse returning a prede- fined format the command can also enter an event-based parsing style where all relevant entries in the input are reported through callback commands, in the style of SAX. ::bibtex::parse text In this form the command will assume that the specified text is a bibliography in BibTeX format, parse it, and then return a list containing one element per record found in the bibliography. Note that comments, string definitions, preambles, etc. will not show up in the result. Each element will be a list containing record type, bibliography key and record data, in this order. The record data will be a dictionary, its keys the keys of the record, with the associated values. ::bibtex::parse ?-command cmd? -channel chan In this form the command will reads the bibliography from the specified Tcl channel chan and then returns the same data structure as described above. If however the option -command is specified the result will be a handle for the parser instead and all processing will be incremen- tal and happen in the background. When the input has been exhausted the callback cmd will be invoked with the result of the parse. The exact definition for the callback is cmd token parseresult The parse result will have the structure explained above, for the simpler forms of the parser. Note that the parser will not close the channel after it has exhausted it. This is still the responsibility of the user of the parser. ::bibtex::parse ?-recordcommand recordcmd? ?-preamblecommand preamblecmd? ?-stringcommand stringcmd? ?-commentcommand commentcmd? ?-progresscommand progresscmd? (text | -channel chan) This is the most low-level form for the parser. The returned result will be a handle for the parser. During processing it will invoke the invoke the specified callback commands for each type of data found in the bibliography. The processing will be incremental and happen in the background if, and only if a Tcl channel chan is specified. For a text the pro- cessing will happen immediately and all callbacks will be invoked before the command itself returns. The callbacks, i.e. *cmd, are all command prefixes and will be invoked with additional arguments appended to them. The meaning of the arguments depends on the callback and is explained below. The first argument will however always be the handle of the parser invoking the callback. recordcmd token type key recorddict This callback is invoked whenever the parser detects a bibliography record in the input. Its arguments are the record type, the bibliography key for the record, and a dictionary containing the keys and values describing the record. Any string macros known to the parser have already been expanded. preamblecmd token preambletext This callback is invoked whenever the parser detects an @preamble block in the input. The only additional argument is the text found in the preamble block. By default such entries are ignored. stringcmd token stringdict This callback is invoked whenever the parser detects an @string-based macro definition in the input. The argument is a dic- tionary with the macro names as keys and their replacement strings as values. By default such definitions are added to the parser state for use in future bibliography records. commentcmd token commenttext This callback is invoked whenever the parser detects a comment in the input. The only additional argument is the comment text. By default such entries are ignored. progresscmd token percent This callback is invoked during processing to tell the user about the progress which has been made. Its argument is the per- centage of data processed, as integer number between 0 and 100. In the case of incremental processing the perecentage will always be -1 as the total number of entries is not known beforehand. ::bibtex::wait token This command waits for the parser represented by the token to complete and then returns. The returned result is the empty string. ::bibtex::destroy token This command cleans up all internal state associated with the parser represented by the handle token, effectively destroying it. This command can be called from within the parser callbacks to terminate processing. ::bibtex::addStrings token stringdict This command adds the macro definitions stored in the dictionary stringdict to the parser represented by the handle token. The dictionary keys are the macro names and the values their replacement strings. This command has the correct signature for use as a -stringcommand callback in an invokation of the command ::bibtex::parse. BUGS, IDEAS, FEEDBACK This document, and the package it describes, will undoubtedly contain bugs and other problems. Please report such in the category bibtex of the Tcllib SF Trackers [http://sourceforge.net/tracker/?group_id=12883]. Please also report any ideas for enhancements you may have for either package and/or documentation. KEYWORDS
bibliography, bibtex, parsing, text processing COPYRIGHT
Copyright (c) 2005 for documentation, Andreas Kupries <andreas_kupries@users.sourceforge.net> bibtex 0.5 bibtex(n)
All times are GMT -4. The time now is 06:57 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy