Cómo soltar una columna en particular en csv usando ruby ​​1.9.2

Intento exportar el csv a una base de datos. CSV contiene algunos datos no deseados que no quiero almacenar en la base de datos. Necesito omitir columnas particulares del csv que obtengo y almacenar el resto de los datos en mi base de datos. Cómo eliminar una columna en particular del csv programáticamente antes de enviar datos a la base de datos. Estoy usando rubí 1.9.2.

Amablemente me ayude

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

Como puede ver, me he saltado un par de columnas como 1,5,6,10

preguntado el 22 de mayo de 12 a las 10:05

@xdazz: He agregado mi código. -

Ya te has saltado algunas columnas, ¿cuál es el problema? -

Pero no funciona, está actualizando los campos incorrectos ya que me salté un par de columnas:

Lo siento, pero no puedo entender por qué serán campos incorrectos. los datos son asignados por usted, usted tiene el control total, ¿no es así? -

2 Respuestas

No estoy seguro si esto ayuda, pero también podrías usar tabla_remota:

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

contestado el 22 de mayo de 12 a las 15:05

Puede usar activewarehouse-etl para hacer esto.

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

Le permitirá especificar las columnas que desea extraer del archivo csv y luego lo cargará de forma masiva en su base de datos.

También puede usarlo para limpiar y verificar los datos que está ingresando, así como para establecer valores predeterminados.

contestado el 22 de mayo de 12 a las 13:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.