Rails向仅包含标头且没有数据的csv添加一行会删除标头

问题描述

我正在从CDN读取CSV文件并向其中添加数据,然后将其写回到CDN,因此,我无法使用附加文件

我也在重新排序文件,这就是为什么我必须将其重新转换为CSV :: Table

的原因

代码是我所拥有的代码的精简版,但问题仍然存在。

class SomeForm::Form
  class << self

    def add
      data = CSV.parse(open(csv_file_url).read,headers: true)
      data << ['david','smith'] # this will be dynamic
      # data = data.sort_by { |row| [row['Firstname'],row['Lastname']] }
      write_csv_file(CSV::Table.new(data).to_csv)
    end


    def csv_file_url
      #somecode to get the file_url
    end

    def write_csv_file(data)
      #somecode to write the file to the cdn
    end
  end
end

CSV文件

Firstname,Lastname

因此,如果我使用上面的csv文件运行SomeForm :: Form.add,它将输出删除标题

,David,smith

但是,如果CSV文件中至少有一条记录,例如

Firstname,Lastname
Steve,Cougan

并运行代码以按预期添加新记录

Firstname,Cougan
david,smith

我想使它与带有数据的csv和仅带标题的csv一起使用。

顺便说一句,这是用于rails3项目的,尽管以上内容也可以在rails 5中复制

预先感谢

解决方法

我简化了脚本,但无法真正再现您的问题。

data = CSV.parse("Firstname,Lastname",headers: true)
data << ['david','smith'] # this will be dynamic
data = data.sort_by { |row| [row['Firstname'],row['Lastname']] }
puts CSV::Table.new(data).to_csv

# Firstname,Lastname
# david,smith

但是,如果您仍然遇到问题,我认为可能是排序问题。 CSV::Table类是可枚举的,但仅在没有标题的CSV行上进行迭代(在col模式下除外),这意味着您的排序可能只返回没有标题的数组数组。现在,当您初始化新的CSV::Table时,默认情况下它将使用第一行作为标题。请注意,您可以像这样访问和设置标题。

data = CSV.parse("Firstname,headers: true)
headers = data.headers

data << ['david',row['Lastname']] }

puts CSV::Table.new(data,headers: headers).to_csv

以下是实现的链接:

,

我已经从Chrisians的答案中进行了一些研究。

并认为这可能是问题https://github.com/ruby/csv/issues/75