Ruby on rails 如何在rails的CSV字符串中添加新列

Ruby on rails 如何在rails的CSV字符串中添加新列,ruby-on-rails,csv,parsing,Ruby On Rails,Csv,Parsing,我想在CSV响应中添加新列并更新现有值。如何以更简单、更好的方式进行以下转换 输入 我使用以下方法来解析csv字符串并添加新列 # Parse original CSV rows = CSV.parse(csv_string, headers: true).collect do |row| hash = row.to_hash # Merge additional data as a hash. hash.merge('email' => 'sample@gmail.com')

我想在CSV响应中添加新列并更新现有值。如何以更简单、更好的方式进行以下转换

输入

我使用以下方法来解析csv字符串并添加新列

# Parse original CSV
rows = CSV.parse(csv_string, headers: true).collect do |row|
  hash = row.to_hash
  # Merge additional data as a hash.
  hash.merge('email' => 'sample@gmail.com')
end

# Extract column names from first row of data
column_names = rows.first.keys
# Generate CSV after transformation of csv
csv_response = CSV.generate do |csv|
  csv << column_names
  rows.each do |row|
    # Extract values for row of data
    csv << row.values_at(*column_names)
  end
end
#解析原始CSV
rows=CSV.parse(CSV_字符串,标题:true)。collect do|row|
散列=行到散列
#将其他数据合并为哈希。
hash.merge('email'=>'sample@gmail.com')
结束
#从第一行数据中提取列名
column_names=rows.first.keys
#转换CSV后生成CSV
csv|u response=csv.generate do|csv|
csv“Jackie”}

解析原始CSV
rows=CSV.parse(CSV_字符串,标题:true)。collect do|row|
散列=行到散列
hash['name']=name_hash[hash['name']]如果name_hash[hash['name']]!=无
搞砸
结束
#从第一行数据中提取列名
column_names=rows.first.keys
#转换CSV后生成CSV
csv|u response=csv.generate do|csv|

csv一个可能的选项,给出了用于修改表格的以下参考数据:

name_hash = {"John" => "Johnny", "Jack" => "Jackie"}
sample_email = {'email' => 'sample@gmail.com'}
csv_response = CSV.generate(headers: rows.first.keys) { |csv| rows.map(&:values).each { |v| csv << v } }
只需将转换为哈希的表存储在行中:

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"}]

然后根据参考数据修改哈希(我在Ruby 2.6.1中使用了Ruby 2.5的别名):


最后还原表:

name_hash = {"John" => "Johnny", "Jack" => "Jackie"}
sample_email = {'email' => 'sample@gmail.com'}
csv_response = CSV.generate(headers: rows.first.keys) { |csv| rows.map(&:values).each { |v| csv << v } }

您的解决方案的性能是否比上述方法更好?我想用更简单的代码更好地处理csv。
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