Ruby:CSV而不是数据库

时间:2015-08-11 05:33:53

标签: ruby csv

是否存在使用CSV作为数据库的框架或gem或类似内容?就像我想在CSV上快速运行一些Ruby命令一样,我可以使用它将它加载到控制台并直接在它上面工作然后在没有实际数据库的情况下重新导出为CSV吗?

我知道它很慢等等,但它并不意味着运行应用程序或任何东西,只是在数据集上运行转换等。

我猜它可以作为一个巨大的哈希加载到内存中然后像这样管理?沿着那条路线的东西?还是有更好的东西?

2 个答案:

答案 0 :(得分:1)

这样的东西
require 'csv'

c = CSV.open(ARGV[0], col_sep: ';', headers: true)

c.each do |row|
  row.fields.each_with_index do |value, i|
    values[c.headers[i]] ||= []
    values[c.headers[i]] << value
  end
end

您可能还希望将它们转换为结构,以便您可以更轻松地处理它。

require 'ostruct'

[...]

values.each do |k,v|
  v.each_with_index do |val, i|
    items[i] ||= OpenStruct.new
    items[i].send("#{k}=", val)
  end
end

保存,您可以执行类似

的操作
CSV.open('file.csv', 'w', :quote_char => '"', :force_quotes => true, :encoding => "UTF-8") do |csv|
  csv << ['header1','header2']
  csv << ['row1 el1', 'row2 el2']
end

希望这会有所帮助

答案 1 :(得分:1)

除了添加一些自制软件的CSV框架外,不需要其他框架。 这样的东西,从命令行使用,你只需要传递参数。

class Csv_db < CSV
  attr_accessor :rows

  def initialize file
    @rows = CSV.read file
  end

  def list
    @rows.each do |row|
        p row
    end
  end

  def add row
    @rows << row
  end

  def get rowindex
    @rows[rowindex]
  end

  def save
    ...
  end
end

csv = Csv_db.new('original.csv')
csv.list
csv.add ['field1','field2']
csv.list
p csv.get 2