file = open("test.graph", 'r') def parse(fd) h, k = {}, "" fd.each do |l| l.chomp! case l when /^[0-9]+->$/ k = l.delete("->") h[k] = [] when /^([0-9]+;)+$/ arr = l.split(";") arr.each do |i| h[k] << i end else puts "in other #{l}" next end end h end parse(file).each do |key,value| value.each do |item| puts "#{key}->#{item};" end end