【问题标题】:Why does RubyGems FasterCSV process [[1,3,5], [2,4,6]].to_csv as "135,246\n"为什么 RubyGems FasterCSV 将 [[1,3,5], [2,4,6]].to_csv 处理为 "135,246\n"
【发布时间】:2010-09-29 01:36:40
【问题描述】:

以下代码:

[1,3,5].to_csv
  => "1,3,5\n"       # this is good

[[1,3,5], [2,4,6]].to_csv
  => "135,246\n"     # why doesn't it just do it for array of array?

但需要这个:

data = [[1,3,5], [2,4,6]]
csv_string = FasterCSV.generate do |csv|
  data.each {|a| csv << a}  
end
 => "1,3,5\n2,4,6\n"

或更短:

data = [[1,3,5], [2,4,6]]
csv_string = FasterCSV.generate {|csv| data.each {|a| csv << a}}
 => "1,3,5\n2,4,6\n"

问题是,当给定一个数组数组时,为什么to_csv没有设计成自动处理它,所以在Rails中,我们可以做到

respond_to do |format|
  format.csv { render :text => data.to_csv }

【问题讨论】:

    标签: ruby-on-rails csv rubygems fastercsv


    【解决方案1】:

    [[1,3,5], [2,4,6]].each{ |line| puts line.to_csv } 还不错。如果需要,您可以随时覆盖 Array#to_csv。

    我怀疑 FasterCSV 决定不实现这一点是因为很难绝对确定这就是程序员想要的。如果输入恰好是 [[1], 2, 3, 4] ?只看外层数组的第一个元素,你就会认为它可能是一个数组数组……

    【讨论】:

    • [[1,3,5], [2,4,6]].each{ |line| puts line.to_csv } 如何处理渲染?因为你只能渲染一次,我想你需要使用s += line.to_csv + "\n",或者(@data.map {|a| a.to_csv}).join("\n")
    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 2013-11-20
    • 2023-03-31
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2019-05-22
    相关资源
    最近更新 更多