2013-06-13 53 views
2

我想閱讀一個csv行,更新一個字段,然後再用引號輸出行。紅寶石閱讀和寫入CSV與行情

Row Example Input => "Joe", "Blow", "[email protected]" 
Desired Row Example Output => "Joe", "Blow", "[email protected]" 

My script below outputs => Joe, Blow, [email protected] 

它丟失了我想保留的雙引號。

我已經嘗試過各種選擇,但目前爲止沒有喜悅..任何提示?

非常感謝!

require 'csv' 

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

row[:customer_email] = '[email protected]' 

puts row 

end 
+0

你想添加引號,如果有擺在首位有沒有?或者你會一直有報價進來? –

+0

行情是在那裏擺在首位。 –

回答

6

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| 
+0

:force_quotes => true對輸出沒有任何影響 –

+0

引號僅在寫入新的CSV文件時相關,而不適用於屏幕上的輸出。 –

0

您可以手動將它們添加到您的所有項目

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

(編輯,因爲我忘了你有一個哈希值,而不是一個數組)

+0

靠近我感覺到但仍然沒有快樂。這個輸出像「[:customer_email,」[email protected]「]」 –

+0

@ user1064314忘記了您正在使用散列;編輯它:) –

+0

添加行=散列[row.map {| k,v | [put,然後輸出如下所示::customer_email =>「\」[email protected] \「」 –

0

感謝賈斯汀L.

以您的解決方案爲基礎,並以此結束。

我感覺Ruby有一些更優雅,但這確實是我需要:

require 'csv' 

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

row[:customer_email] = '[email protected]' 

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