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;自动。
我该怎么做?
答案 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