Ruby使用引号读写CSV

时间:2013-06-13 05:35:38

标签: ruby csv

我想在csv行中读取,更新一个字段然后再用引号输出该行。

Row Example Input => "Joe", "Blow", "joe@blow.com"
Desired Row Example Output => "Joe", "Blow", "xxxx@xxxx.xxx"

My script below outputs => Joe, Blow, xxxx@xxxx.xxx

它丢失了我想保留的双引号。

到目前为止,我尝试了各种选择,但没有任何提示..任何提示?

非常感谢!

require 'csv'

CSV.foreach('transactions.csv',
            :quote_char=>'"',
            :col_sep =>",", 
            :headers => true, 
            :header_converters => :symbol ) do |row| 

row[:customer_email] = 'xxxx@xxxx.xxx'

puts row

end

3 个答案:

答案 0 :(得分:7)

CSV字段中的引号通常是不必要的,除非字段本身包含分隔符或换行符。但您可以强制CSV文件始终使用引号。 For that, you need to set force_quotes => true

CSV.foreach('transactions.csv',
            :quote_char=>'"',
            :col_sep =>",", 
            :headers => true, 
            :force_quotes => true,
            :header_converters => :symbol ) do |row| 

答案 1 :(得分:0)

您可以手动将它们添加到所有商品

Hash[row.map { |k,v| [k,"\"#{v}\""] }]

(编辑因为我忘了你有哈希而不是数组)

答案 2 :(得分:0)

感谢Justin L.

以你的解决方案为基础,最终得到了这个。

我觉得Ruby有更优雅的东西,但这就是我需要的东西:

require 'csv'

CSV.foreach('trans.csv',
            :quote_char=>'"',
            :col_sep =>",", 
            :headers => true,
            :header_converters => :symbol ) do |row| 

row[:customer_email] = 'xxxx@xxxx.xxx'

row = Hash[row.map { |k,v| [k,"\"#{v}\""] }]

new_row = ""

row.each_with_index do | (k, v) ,i|
  new_row += v.to_s
  if i != row.length - 1
    new_row += ','
  end
end

puts new_row

end