我尝试将csv导出到数据库。 CSV包含一些我不想存储在数据库中的不需要的数据。我需要跳过csv中的特定列,并将其余的数据存储在我的数据库中。在将数据推送到数据库之前,如何以编程方式从csv中删除特定列。我使用的是ruby 1.9.2。
请帮助我
def csv_import
#@parsed_file = csv.open(params[:dump][:file])
puts "before CSV Reader"
file = params["dump"]["file"]
directory = "#{Rails.root.to_s}/public/dump"
# create the file path
path = File.join(directory, "#{file.original_filename}")
# write the file
File.open(path, "wb") { |f| f.write(file.read) }
@parsed_file=CSV.open(path, "r")
@parsed_file.drop(1).each do |row|
n=0
c=ModelName.new
c.invoiceno=row[2]
c.invoice_date=row[3]
c.orderrefno = row[4]
c.skucode = row[7]
c.quantiy = row[8]
c.amount = row[9]
c.trackno=row[11]
c.dispatched = "No"
c.mailsenttoc = "No"
c.mailsenttobluedart = "No"
if c.save
n=n+1
GC.start if n%50==0
end
end
end
正如您所看到的,我已经跳过了几列,如1,5,6,10
答案 0 :(得分:1)
不确定这是否有帮助,但您也可以使用remote_table:
require 'remote_table'
def csv_import
# [...]
RemoteTable.new("file://#{path}", :format => :csv, :headers => :false).each do |row|
c = ModelName.new
c.invoiceno = row[2]
c.invoice_date = row[3]
c.orderrefno = row[4]
c.skucode = row[7]
c.quantiy = row[8]
c.amount = row[9]
c.trackno = row[11]
c.dispatched = "No"
c.mailsenttoc = "No"
c.mailsenttobluedart = "No"
if c.save
# [...]
end
end
# [...]
end
答案 1 :(得分:0)
您可以使用activewarehouse-etl执行此操作。
https://github.com/activewarehouse/activewarehouse-etl
它允许您指定要从csv文件中提取的列,然后将其批量上传到您的数据库。
您还可以使用它来清理和验证您输入的数据以及设置默认值。