Skip to content

Instantly share code, notes, and snippets.

@tfuji
Last active October 4, 2020 07:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tfuji/a1102e5d20531d3717e0d95eede12587 to your computer and use it in GitHub Desktop.
Save tfuji/a1102e5d20531d3717e0d95eede12587 to your computer and use it in GitHub Desktop.
metabobank-json2json
#!/usr/bin/env ruby
require 'json'
require 'pp'
class MetabobankJsonConverter
def initialize file
@file = file
check_for_json_format
set_persons
convert_person
end
def check_for_json_format
begin
@data = JSON.parse(File.read(@file))
rescue Exception => ex
puts ex.backtrace.first + ": #{ex.message} (#{ex.class})"
puts "perse error\t#{ex.message}"
exit
end
end
def set_persons
@persons ={}
if person = @data['metadata'].find { |s| s['sheet_id'] == 'person' }
person['data'].map {|d|
d.inject( {} ){ |a,(k,v)|
#pp "###{k}"
k_new = k
v.each do |kk,vv|
#pp [kk,vv]
if kk == 'label'
@persons[vv[0]] = k
k_new = label2id(vv[0])
end
end
a[k_new]=v;
a
}
}
end
#pp @persons
end
def convert_person
person_items = %w(person_principal_investigator person_creator person_submitter person_contact)
#pp person_items
@data['metadata'].each_with_index do |s,i|
if s['sheet_id'] == 'project'
#puts i
@data['metadata'][i]['data'].map{|d|
d.inject( {} ){ |a,(k,v)|
v_new = v
v.each do |kk,vv|
if person_items.include? kk
vv.map! {|name| label2id(name) }
v_new[kk] = vv
end
#pp vv
end
a[k]=v_new;
a
}
}
#puts @data['metadata'][i]['data']
end
end
end
def label2id label
@persons[label]
#label.gsub(' ','_')
end
def output
puts JSON.pretty_generate(@data)
end
end
input_file = ARGV[0]
mb = MetabobankJsonConverter.new(input_file)
mb.output
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment