使用Sequel和SQLite3 gems将CSV文件读入Ruby

时间:2014-07-15 16:43:15

标签: ruby csv sqlite sequel fastercsv

我需要从两个CSV文件中读取数据并将它们加载到两个不同的表中的SQLite3中。然后,我想查询两个表并创建一个需要输出到新CSV / Excel的新数据集。这样做最好的方法是什么?

我正在考虑SQLite3,Sequel和FasterCSV的组合。

还有一个CSV2SQLite gem,但我不确定如何使用它。

此外,如果有人有代码段,那将非常感激。

2 个答案:

答案 0 :(得分:1)

require 'csv'

csv_file_1 = CSV.read("/home/user/Desktop/first_file_1.csv")
csv_file_2 = CSV.read("/home/user/Desktop/first_file_2.csv")

csv_file_1[0][0] = ["name", "phone"] #ect 

#
# logic goes here to work with your csv files 
# 

require 'sequel'
DB = Sequel.sqlite("/home/user/Desktop/csv.db")

DB.create_table :people do 
  primary_key :id
  String :name
  String :phone
end

database = DB[:people]


database.insert(:name => "duck", :phone => "867-5309")

#logic goes here to insert/sort/manipulate your CSV files.  

BOOM读取csv文件并使用续集ruby gem创建表。

答案 1 :(得分:0)

我使用另一个代码snipplet:

def import_csv(tabname, data)    
  csv = CSV.parse(data, :headers=> true, :header_converters => :symbol )
  DB.create_table(tabname){
    primary_key :id
    csv.headers.each{|col|    
      String col
    }
  } 
  p csv.headers
  DB[tabname].multi_insert(csv.map {|row| row.to_h})
  #~ csv.each{|row|
    #~ DB[tabname].insert(row.to_h)
  #~ }
end

它读取CSV数据并创建表格列CSV-headers(作为字符串)。然后将所有数据复制到表格中。

一个完整的例子:

#encoding: utf-8
=begin
=end
    require 'sequel'
    require 'csv'
    Sequel.extension :pretty_table  #Sequel::PrettyTable.print()/Sequel::PrettyTable.string()
=begin
Test data
=end
    DB = Sequel.sqlite

def import_csv(tabname, data)    
  csv = CSV.parse(data, :headers=> true, :header_converters => :symbol )
  DB.create_table(tabname){
    primary_key :id
    csv.headers.each{|col|    
      String col
    }
  } 
  p csv.headers
  DB[tabname].multi_insert(csv.map {|row| row.to_h})
  #~ csv.each{|row|
    #~ DB[tabname].insert(row.to_h)
  #~ }
end

import_csv(:tab1, DATA.read)    

DB.tables.each{|table|
  puts table
  Sequel::PrettyTable.print(DB[table])
}

    #~ Sequel::PrettyTable.print(DB[:mytables].filter(Sequel.like(:a, 'a%')))
__END__
a,b,c,d,e
1,2,3,4,5
1,2,3,4,5
1,2,3,4,5