9

我正在我的 Ruby 应用程序中创建一个 CSV 下载,其中包含一些美元金额字段。这些字段具有 cyrrency 格式的数据,例如 $35,456,当这些数据以 CSV 格式出现时,它被分成两个字段,逗号后的数据移动到 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​​ 中转义“,”

谢谢

4

2 回答 2

15

使用 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 文件中。

应该这样做!

J.P

于 2015-04-29T15:58:06.967 回答
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"
于 2012-09-07T13:06:48.260 回答