如何使用ruby 1.9.2删除csv中的特定列

时间:2012-05-22 09:24:02

标签: ruby-on-rails ruby ruby-on-rails-3.1

我尝试将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

2 个答案:

答案 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文件中提取的列,然后将其批量上传到您的数据库。

您还可以使用它来清理和验证您输入的数据以及设置默认值。