我想在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
答案 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