我想使用Ruby将CSV文件导入到PostgreSQL表中。我希望自动(带有任务)执行此操作,因为具有相同结构的新文件将每月导入。它首先将其复制到一个临时表(在本例中为“ test”),然后再插入另一个表。
这就是我想要做的:
这是我正在使用的CSV内容:
col 1,col 2,col 3
r1c1,r1c2,r1c3
r2c1,r2c2,r2c3
通过搜索stackoverflow和其他地方,这是我得到的以下代码。
task :insert_charge [:file] => :environment do |task,args|
require 'csv'
testfile = CSV.read(args[:file],
:headers => true,
:converters => :all,
:header_converters => lambda { |h| h.gsub(' ', '_') }
)
ActiveRecord::Base.connection.execute("
drop table if exists test;
create table test (
id serial primary key,
col_1 varchar(4),
col_3 varchar(4)
);
")
conn = PG::Connection.open(
:user => Rails.configuration.database_configuration["development"]["username"],
:dbname => Rails.configuration.database_configuration["development"]["database"],
:password => Rails.configuration.database_configuration["development"]["password"]
)
conn.copy_data "copy test (col_1, col_3)
from stdin csv header delimiter ',' null as '' encoding 'utf-8'" do
conn.put_copy_data testfile
end
end
我可以成功地用下划线更改标题中的空格。但是,这会将CSV更改为表模式,然后无法将其复制到数据库中。如何修改标题,然后将CSV复制到数据库中?
这是我做rake insert_charge [d:\\test.csv]
时遇到的错误:
TypeError:错误的参数类型CSV :: Table(预期的字符串)
请考虑到我是真正的Ruby初学者。我见过与我类似的问题,但是没有答案可以解决我的问题。
感谢您的帮助!
答案 0 :(得分:0)
也许您可以考虑修复改写文件的标头,更改第一行:
lines = File.readlines('test.csv')
new_header = lines[0].chomp.split(',').map{ |w| w.gsub(' ', '_')}.join(',')
lines[0] = new_header << $/
File.open('test.csv', 'w') { |f| f.write(lines.join) }
如果您不想覆盖文件,只需更改输出文件的名称。
(在这里被盗:https://stackoverflow.com/a/35958805)
然后,您可能不需要使用csv
库读取文件,只需将字符串传递给进程,请尝试:
testfile = File.read('test.csv')
p testfile.class #=> String