【问题标题】:Rails - import CSV entry as array in PostgreSQLRails - 在 PostgreSQL 中将 CSV 条目作为数组导入
【发布时间】:2014-03-26 04:52:01
【问题描述】:

我正在使用 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; dog; foo; bar”的条目。现在,这个条目作为“文本”(即数据类型)导入 PostgreSQL。但是,我希望将文本拆分为“;”,并将拆分结果作为文本 array 存储在 PostgreSQL 中。

我该怎么做?

编辑澄清:

我的数据如下所示:

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

现在,当我运行我的 rake 任务时,“John”作为文本进入 PostgreSQL。 “劳拉;鲍勃”也作为文本进入 PostgreSQL。但是,我希望将“Laura; Bob”(以及类似的“Jack;Carol”、“Seth;Annie;Doug”和“Jim;Cassie;Jane”)作为文本进入 PostgreSQL 数组。一个这样的数组看起来像 [Jack, Carol]。

【问题讨论】:

    标签: ruby-on-rails postgresql csv


    【解决方案1】:

    试试这个

    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"]}
    

    【讨论】:

    • 嗨,南达——感谢您的回答!我正在尝试将条目(例如“猫;狗;汽车”)转换为数组。我实际上并不希望整行数据成为一个数组。
    • 在这种情况下,您可以使用a="cat;dog;car"; a.split(";") 这将返回一个数组
    • "cat; dog; car" 和 "foo; bar; 是 .csv 文件中的示例条目。
    • 没关系。假设您有 row 作为文本,并且您想将其拆分为 ; 使用 row.split(";")
    • 你认为你可以看看我的澄清吗?再次感谢您的帮助!
    猜你喜欢
    • 2018-09-21
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多