Я хочу импортировать файл CSV в таблицу PostgreSQL с Ruby.Я хочу сделать это автоматически (с заданием), потому что новые файлы с такой же структурой будут импортироваться ежемесячно.Сначала он копируется во временную таблицу, в данном случае «тест», а затем вставляется в другую таблицу.
Вот что я хочу сделать:
- Некоторые заголовкифайла CSV содержат пробелы, и я хочу заменить их подчеркиванием, чтобы мне не пришлось разбираться с ними позже.Например, «col 1» должен стать «col_1».
- Некоторые столбцы в файле CSV бесполезны, и я не хочу копировать их в базу данных.Например, из «col_1», «col_2» и «col_3» я хочу скопировать только «col_1» и «col_3».
Вот содержимое 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.Я видел вопросы, похожие на мои, но нет ответов, что я работаю для своей проблемы.
Спасибо за вашу помощь!