6

我想读取 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
4

3 回答 3

9

CSV 字段中的引号通常是不必要的,除非字段本身包含分隔符或换行符。但是您可以强制 CSV 文件始终使用引号。为此,您需要设置force_quotes => true

CSV.foreach('transactions.csv',
            :quote_char=>'"',
            :col_sep =>",", 
            :headers => true, 
            :force_quotes => true,
            :header_converters => :symbol ) do |row| 
于 2013-06-13T05:39:22.753 回答
1

您可以手动将它们添加到您的所有项目中

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

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

于 2013-06-13T05:56:08.900 回答
1

谢谢贾斯汀 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
于 2013-06-13T08:07:11.930 回答