Один из возможных вариантов, учитывая следующие справочные данные, которые будут использоваться для изменения таблицы:
name_hash = {"John" => "Johnny", "Jack" => "Jackie"}
sample_email = {'email' => 'sample@gmail.com'}
Просто сохраняйте в строках таблицу, преобразованную в хэш:
rows = CSV.parse(csv_string, headers: true).map(&:to_h)
#=> [{"id"=>"1", "name"=>"John", "country"=>"US"}, {"id"=>"2", "name"=>"Jack", "country"=>"UK"}, {"id"=>"3", "name"=>"Sam", "country"=>"UK"}]
Затем измените хэш на основе справочных данных (я использовал
Object # затем для псевдонима Ruby 2.6.1
Object # yield_self для Ruby 2.5):
rows.each { |h| h.merge!(sample_email).then {|h| h['name'] = name_hash[h['name']] if name_hash[h['name']] } }
#=> [{"id"=>"1", "name"=>"Johnny", "country"=>"US", "email"=>"sample@gmail.com"}, {"id"=>"2", "name"=>"Jackie", "country"=>"UK", "email"=>"sample@gmail.com"}, {"id"=>"3", "name"=>"Sam", "country"=>"UK", "email"=>"sample@gmail.com"}]
Наконец восстановите таблицу:
csv_response = CSV.generate(headers: rows.first.keys) { |csv| rows.map(&:values).each { |v| csv << v } }
Итак, теперь у вас есть:
puts csv_response
# id,name,country,email
# 1,Johnny,US,sample@gmail.com
# 2,Jackie,UK,sample@gmail.com
# 3,Sam,UK,sample@gmail.com