2014-03-26 31 views
2

我正在使用Ruby on Rails耙子任务将.csv文件导入PostgreSQL数据库。我的代码,以供参考,下面是:Rails - 在PostgreSQL中将CSV条目导入为数组

require 'csv'  

namespace :db do 
    desc "Populate database" 
    task populate_database: :environment do 

     CSV.foreach("db.csv", :headers => true) do |row| 
      Sale.create!(row.to_hash) 
     end 

    end 
end 

在.csv文件,我在格式的条目“的猫,狗,FOO;酒吧”。现在,这个条目被作为“文本”(即数据类型)导入到PostgreSQL中。但是,我想要将文本拆分为“;”,并将拆分结果作为文本存储在PostgreSQL中。array

我该如何去做这件事?

编辑澄清:

我的数据看起来是这样的:

 column 1   | column 2 | column 3 
row 1 John    | Jack; Carol | Seth; Annie; Doug 
row 2 Jim; Cassie; Jane | Anne  | Laura; Bob 

现在,当我运行rake任务, “约翰” 进入PostgreSQL的文本。 “Laura; Bob”也以文本形式进入PostgreSQL。然而,我想为“Laura; Bob”(并且类似地,“Jack; Carol”,“Seth; Annie; Doug”和“Jim; Cassie; Jane”)以文本形式进入PostgreSQL array 。一个这样的阵列看起来像[杰克,卡罗尔]。

回答

0

试试这个

csv_file = open("363Live data v0.csv") 
CSV.parse(csv_file.read, {:headers => true}).each do |row| 
    # row is an array 
    puts row.inspect 
    Sale.create!(row.to_hash) 
end 

编辑澄清后:

假设 - 你的多个值总是被; 分离您可能需要检查每一个细胞,如果它有一个;,然后转换进入阵列

# row => {"col1" => "John", "col2" => "Seth; Annie; Doug"} 

CSV.foreach("363Live data v0.csv", :headers => true) do |row| 
    row.to_hash.map do |key, value| 
     row[key] = value.split(';').map {|v| v.strip} unless value.index(';').nil? 
    end 
    Sale.create!(row) 
end 

# row => {"col1"=>"John", "col2"=>["Seth", "Annie", "Doug"]} 
+0

嗨南达 - 谢谢你的回答!我试图将一个条目(例如“猫;狗;汽车”)变成一个数组。我实际上并不希望整行数据是一个数组。 – user1274740

+0

在这种情况下,您可以使用'a =“cat; dog; car”; a.split(“;”)'这会返回一个数组 – Nanda

+0

“cat; dog; car”和“foo; bar;是.csv文件中的示例条目,虽然。 – user1274740