最好的方式来加载Rails表与特定的数据从某些列在多个CSV文件?



我有一个超过100列的CSV数据集,标题分为两个文件,以及Rails/PostgreSQL中的一个表,其字段仅用于特定列数据,约60列。

解析csv并创建一个表条目来填充我需要的特定列的键的最佳方法是什么?

作为一个示例,这是我到目前为止所拥有的:ID,:DESC,:PROGRAM,:PROGRAM_DESC作为我需要从中提取的数据集中的几个列名,以及p_id, description, program_name和program_description作为我的表中的字段。

似乎不起作用,条目都被nil值填充。

file = File.read(Rails.root.join('lib', 'assets', 'test.csv'))
fileCSV = CSV.parse(file, :headers => true)
fileCSV.each do |row|
Program.create_or_find_by!(p_id: row[:ID], description: row[:DESC], program_name: row[:PROGRAM], program_description: row[:PROGRAM_DESC])
end

我计划对第一个文件中的每个条目进行创建,然后查找条目并匹配它们以更新第二个文件中的必要列。但是,编写逻辑以使列与适当的字段相匹配的最佳方法是什么?

编辑:我想我已经成功了,至少在这4列中。

我已经看过了。To_hash和一开始没有得到逻辑,但想法是将整个行保存为散列,然后在创建条目时分配值?

file = File.read(Rails.root.join('lib', 'assets', 'test.csv'))
fileCSV = CSV.parse(file, :headers => true)
fileCSV.each do |row|
rowHash = row.to_hash
Program.create_or_find_by!(p_id: rowHash['ID'], description: rowHash['DESC'], program_name: rowHash['PROGRAM'], program_description: rowHash['PROGRAM_DESC'])
end

当它是rowHash中的符号时,我无法读取ID,但它是字符串时读取,如rowHash['ID']。我检查了。class上的ID值,它读取为字符串,将ID正确输入,即使该字段接受整数?

还在寻找一种有效的方法来从多个CSV中加载单个条目…

试试这个,为我工作

## services/programs/csv.rb
require 'csv'
module Programs
class Csv
def self.import(file)
new(file).import
end

def import
CSV.foreach(file.path, col_sep: ';', headers: true, encoding: 'bom|utf-8', strip: true) do |row|
data = row.to_h
p = Program.where(p_id: data['ID']).first_or_initialize
p.description = data['Desc']
p.program_name = data['PROGRAM']
p.program_description = data['PROGRAM_DESC']
p.save
end
end

def initialize(file)
@file = file
end
attr_accessor :file
end
end

,在需要的地方调用Programs::Csv.import(file)。这个设置适合我,我希望它对你有帮助。

最新更新