Rails - 在PostgreSQL中将CSV条目导入为数组

时间:2014-03-26 04:52:01

标签: ruby-on-rails postgresql csv

我使用Ruby on Rails rake任务将.csv文件导入我的PostgreSQL数据库。我的代码供参考,如下:

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文件中,我有一个格式为" cat的条目;狗; FOO; BAR&#34 ;.现在,这个条目被导入到PostgreSQL中作为" text" (即数据类型)。但是,我希望将文本拆分为&#34 ;; "并且拆分的结果将作为文本 数组 存储在PostgreSQL中。

我该怎么做?

编辑澄清:

我的数据看起来像这样:

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

现在,当我执行我的佣金任务时," John"以文本形式进入PostgreSQL。 "劳拉;鲍勃"也作为文本进入PostgreSQL。但是,我喜欢"劳拉;鲍勃" (同样地," Jack; Carol"," Seth; Annie; Doug"和" Jim; Cassie; Jane")作为文本进入PostgreSQL的阵列即可。一个这样的阵列看起来像[杰克,卡罗尔]。

1 个答案:

答案 0 :(得分: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"]}