1

csv をデータベースにエクスポートしようとしています。CSV には、データベースに保存したくない不要なデータが含まれています。取得したcsvから特定の列をスキップして、残りのデータをデータベースに保存する必要があります。DB にデータをプッシュする前に、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 のようないくつかの列をスキップしました

4

2 に答える 2

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
于 2012-05-22T14:43:49.363 に答える
0

これを行うには、activewarehouse-etlを使用できます。

https://github.com/activewarehouse/activewarehouse-etl

これにより、csvファイルからプルする列を指定して、データベースに一括アップロードできます。

また、これを使用して、入力するデータをクリーンアップおよび検証したり、デフォルト値を設定したりすることもできます。

于 2012-05-22T12:51:05.100 に答える