问题描述
我正在从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
以下是实现的链接:
- https://github.com/ruby/ruby/blob/master/lib/csv/table.rb#L31-L43
- https://github.com/ruby/ruby/blob/master/lib/csv/table.rb#L334-L338
我已经从Chrisians的答案中进行了一些研究。