从Ruby中的CSV中逃脱逗号

时间:2012-09-07 12:59:10

标签: ruby-on-rails csv

我正在我的Ruby应用程序中创建一个CSV下载,它有一些美元金额字段。这些字段的数据为cyrrency格式,如$ 35,456,当这些数据以CSV格式显示时,它会分成两个fiedls,逗号后的数据以CSV格式移动到下一列。

这是我的代码,用于呈现CSV

Sell Date, Sell Amount
- @rows.each do |row|
  = "#{row[0]},#{number_to_currency(row[1], :precision => 2)}"

以下是用于返回CSV的操作

def fifolog
  @rows = Report.fifolog()
respond_to do |format|
  format.csv { render csv: {:rows =>@rows }}
end
end

我可以使用任何转义字符来逃避“,”在ruby中

感谢

2 个答案:

答案 0 :(得分:11)

使用Ruby的内置to_csv方法。

如果您还没有这样做,则需要require 'csv'

Sell Date, Sell Amount
- @rows.each do |row|
  = [ row[0], number_to_currency(row[1], :precision => 2) ].to_csv( row_sep: nil ).html_safe

to_csv可以在Array上找到,并且可以完成您期望的所有操作。

row_sep: nil会阻止每行末尾的\n,因为您已经使用each执行此操作。没有它,尝试它,你会看到你得到一个额外的空白行。如果您只是生成一个CSV字符串,那么您需要让\n分隔行。

html_safe可阻止"个字符显示在您的CSV文件中。

应该这样做!

JP

答案 1 :(得分:6)

在带逗号的值周围使用双引号:

"$35,456"

修改: 使用FasterCSV,更改以下行:

respond_to do |format|
  format.csv { render csv: {:rows =>@rows }}

csv_data = FasterCSV.generate do |csv| 
    csv << ["Sell Date", "Sell Amount"] 

    @rows.each do |row| 
      csv << [row[0],number_to_currency(row[1], :precision => 2)] 
    end 
  end 

  send_data csv_data, 
            :type => 'text/csv', 
            :disposition => "attachment; filename=file.csv"