当CSV.generate时,生成空字段而不用""

时间:2018-03-07 03:09:16

标签: ruby-on-rails ruby csv ruby-on-rails-4

Ruby 2.2,Ruby on Rails 4.2

我在Ruby on Rails中创建了一些CSV数据,并希望空字段为空,例如,,不像,"",。 我写了如下代码:

somethings_cotroller.rb

def get_data
  respond_to do |format|
    format.html
    format.csv do
      @data = SheetRepository.accounts_data
      send_data render_to_string, type: :csv
    end
  end
end

出头/ get_data.csv.ruby

require 'csv'
csv_str = CSV.generate do |csv|
  csv << [1,260,37335,'','','','','','']
  ...
end

这会生成这样的CSV文件。

get_data.csv

1,260,37335,"","","","","",""

我想要如下的CSV数据。

1,260,37335,,,,,,

似乎Ruby添加了#34;&#34;自动。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

为了让CSV输出一个空列,您需要告诉它列中没有任何内容。在ruby中的空字符串仍然是一些东西,您需要用nil替换这些空字符串以获得所需的输出:

csv_str = CSV.generate do |csv|
  csv << [1,260,37335,'','','','','',''].map do |col|
    col.respond_to?(:empty?) && col.empty? ? nil : col
  end
end
# => 1,260,37335,,,,,,

在rails中,您可以使用presence清除它,但这也会使false空白:

csv_str = CSV.generate do |csv|
  csv << [1,260,37335,'',false, nil,'','',''].map(&:presence)
end
# => 1,260,37335,,,,,,

答案 1 :(得分:1)

CSV documentation显示可用于这种情况的选项。没有示例,但您可以猜测它的作用。

唯一的考虑是,您需要发送一个字符串数组,否则,您将得到一个NoMethodError

csv_str = CSV.generate(write_empty_value: nil) do |csv|
  csv << [1,260,37335,'','','','','','', false, ' ', nil].map(&:to_s)
end
=> "1,260,37335,,,,,,,false, ,\n"

此解决方案的好处是,您可以保留false

答案 2 :(得分:0)

我自己解决了!

在somethings_controller.rb

send_data render_to_string.gsub("\"\"",""), type: :csv