Как исправить заголовки в CSV-файле с Ruby, а затем скопировать в базу данных postgresql? - PullRequest
0 голосов
/ 21 декабря 2018

Я хочу импортировать файл 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.Я видел вопросы, похожие на мои, но нет ответов, что я работаю для своей проблемы.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 22 декабря 2018

Может быть, вы можете исправить заголовки, переписывая файл, измените первую строку:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...