def self.csv_each(filename, headers)
raise CSVHelperError, 'Expecting block' unless block_given?
reader = CSV.open(filename, 'r')
real_header = reader.shift
raise CSVHelperError, "No header in #{filename}" if real_header.nil?
to_discard = real_header - headers
headers.each do |col|
raise CSVHelperError, "Column #{col} expected in #{filename}" unless real_header.include? col
end
reader.each do |row|
data = Hash[real_header.zip row]
to_discard.each { |key| data.delete key }
class << data
def[](key)
raise CSVHelperError, "Referencing undeclared key: #{key}" unless key? key
super
end
end
yield data
end
end