如何使用Ruby修复csv文件中的标头,然后将其复制到postgresql数据库?

时间:2018-12-21 19:44:05

标签: ruby postgresql csv

我想使用Ruby将CSV文件导入到PostgreSQL表中。我希望自动(带有任务)执行此操作,因为具有相同结构的新文件将每月导入。它首先将其复制到一个临时表(在本例中为“ test”),然后再插入另一个表。

这就是我想要做的:

  • 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 :(得分: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