2014-07-15 15 views
0

두 개의 CSV 파일에서 데이터를 읽고 두 개의 다른 테이블에서 SQLite3에로드해야합니다. 그런 다음 두 테이블을 쿼리하고 새 CSV/Excel로 출력해야하는 새 데이터 집합을 만들려고합니다. 이 일을하는 가장 좋은 방법은 무엇입니까?Sequel과 SQLite3 gem을 사용하여 CSV 파일을 Ruby로 읽기

나는 SQLite3, Sequel 및 FasterCSV의 조합을 생각하고 있습니다.

CSV2SQLite 젬도 있지만 사용법은 잘 모르겠습니다.

또한 코드 스 니펫이있는 사람이라면 정말 감사하겠습니다.

+0

읽을 루비를 사용할 필요가 없다 (http://www.sqlite.org/cvstrac/wiki?p=ImportingFiles)이므로 [SQLite는 기본적으로는 CSV 읽을 수] 그것. –

답변

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 파일을 읽고 sequel ruby ​​gem으로 표를 만듭니다.

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 헤더를 작성

+0

감사합니다! 당신의 도움을 주셔서 감사합니다. –

0

난 snipplet 다른 코드를 사용한다. 그런 다음 모든 데이터가 테이블에 복사됩니다.

전체 예 :

#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