Skip to content

Instantly share code, notes, and snippets.

@seifertd
Last active December 18, 2015 03:29
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 seifertd/5718964 to your computer and use it in GitHub Desktop.
Save seifertd/5718964 to your computer and use it in GitHub Desktop.
CSV to nested hashrequire 'csv'
require 'csv'
users_by_id = {}
CSV.new(DATA, headers: true).each do |row|
user_id = row['user_id'].to_i
supervisor_id = row['supervisor_id'].to_i
is_supervisor = row['is_supervisor'] == 't'
existing_user = (users_by_id[user_id] ||= { user_name: row['user_name'], user_id: user_id})
existing_user[:users] ||= [] if is_supervisor
supervisor = users_by_id[supervisor_id]
if supervisor
supervisor[:users] << existing_user
end
end
puts users_by_id[1].inspect
__END__
user_name,user_id,supervisor_id,is_supervisor
admin,1,0,t
foo,2,1,t
test,3,2,f
require 'csv'
class User
attr_reader :name, :id
def self.by_id
@by_id ||= {}
end
def initialize(name, id)
@name = name
@id = id
User.by_id[id] = self
end
def to_hash
{ :user_name => name, :user_id => id }
end
end
class Supervisor < User
attr_reader :users
def initialize(name, id)
super
@users = []
end
def to_hash
h = super
h[:users] = users.map(&:to_hash)
h
end
end
root_user = nil
users_by_id = {}
CSV.new(DATA, headers: true).each do |row|
user_id = row['user_id'].to_i
supervisor_id = row['supervisor_id'].to_i
is_supervisor = row['is_supervisor'] == 't'
unless root_user
root_user = Supervisor.new(row['user_name'], user_id)
else
user = if is_supervisor
Supervisor.new(row['user_name'], user_id)
else
User.new(row['user_name'], user_id)
end
supervisor = User.by_id[supervisor_id]
supervisor.users << user if supervisor
end
end
puts root_user.to_hash
__END__
user_name,user_id,supervisor_id,is_supervisor
admin,1,0,t
foo,2,1,t
test,3,2,f
$ ruby nested_csv.rb
{:user_name=>"admin", :user_id=>1, :users=>[{:user_name=>"foo", :user_id=>2, :users=>[{:user_name=>"test", :user_id=>3}]}]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment