簡體   English   中英

CSV.generate時,生成不帶“”的空字段

[英]When CSV.generate, generate empty field without “”

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 文件。

獲取數據.csv

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

我想要像下面這樣的 CSV 數據。

1,260,37335,,,,,,

看起來Ruby會自動添加“”。

我該怎么做??

為了讓 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,,,,,,

CSV 文檔顯示了可用於這種情況的選項。 沒有例子,但你可以猜到它的作用。

唯一的考慮是,你需要發送一個字符串數組,否則,你會得到一個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

我自己解決了!

在 somethings_controller.rb 中

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM