2013-06-13 3 views
2

Я хотел бы прочитать строку csv, обновить одно поле, а затем снова выводить строку с кавычками.Ruby Чтение и запись 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 = Hash [row.map {| k, v | [k, "\" # {v} \ ""]}] перед тем, как помещать строку, а затем вывод выглядит следующим образом:: customer_email => "\" [email protected] \ "" –

0

Благодаря Justin L.

Построено на вашем решении и закончилось этим.

Я получаю чувство Руби есть что-то более элегантное, но это делает то, что мне нужно:

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 
Смежные вопросы