bibtex-rubyを使ってMendeleyでエクスポートしたbibファイルをcsv形式にする

bibtex-rubyを使って、Mendeleyでエクスポートしたbibファイルをcsv形式にする。

環境

Rubyの環境構築はRVMで行っている。(Ruby 2.1.0 + Ruby on Rails 4.0.2

% rvm -v
rvm 1.25.22 (stable) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

% ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]

bibtex-rubyのインストール

Gemでインストールする。

% rvmsudo gem install bibtex-ruby

ソースコード

以下の内容をbib2csv.rbとする。

# -*- coding: utf-8 -*-

require 'bibtex'
require 'csv'

class BibTeXToCSV
  
  def initialize(bibfile)
    unless File.exist?(bibfile)
      puts "error: no such file #{bibfile}\n"
      exit
    end
    @bib = BibTeX.open(ARGV[0])

    @attributeAry = Array.new
    @bib.each do | ref |
      ref.to_hash.each_key do |key|
        @attributeAry.push(key) unless @attributeAry.include?(key)
      end
    end
    @attributeAry.sort!
  end

  def to_csv(output)

    puts " Transform bib to ary ...\n"
    # 見出し行の作成
    bibAry = Array.new
    tmpAry = ["id"] + @attributeAry
    bibAry.push(tmpAry)

    # 各書誌情報を配列に。存在しない属性はN/Aで統一
    index = 1
    @bib.each do | ref |
      refHash = ref.to_hash
      tmpAry = Array.new
      tmpAry.push(index)
      index += 1
      @attributeAry.each do | attribute |
        if refHash.key?(attribute)
          # 余計な中括弧の除去
          if refHash[attribute] =~ /^\{(.*)\}$/
            str = $1
          else
            str = refHash[attribute]
          end
          tmpAry.push(str)
        else
          tmpAry.push('N/A')
        end
      end
      bibAry.push(tmpAry)
    end

    # CSVとして書き出し
    puts " Create csv file #{output}"
    CSV.open(output, "wb") do | csv |
      bibAry.each do | ary |
        csv  << ary
      end
    end
  end
end

begin
  if ARGV.length != 2
    puts "error: please input path to the target bib file and output file.\n"
    exit
  end

  b = BibTeXToCSV.new(ARGV[0])
  b.to_csv(ARGV[1])

rescue => ex
  puts ex.message
  puts $@
end

使い方

Mendeleydeskdopで出力したbibファイルを my.bibとしたとき以下のように使う。

% ruby bib2csv.rb my.bib my.csv