6

csv行を読み込んで、1つのフィールドを更新してから、引用符で行を再度出力したいと思います。

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

ありがとう、ジャスティン 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 に答える
1

すべてのアイテムに手動で追加できます

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

(配列ではなくハッシュがあることを忘れていたので編集しました)

于 2013-06-13T05:56:08.900 に答える