2012-07-31 21 views
18

de Ruby CSV hace que sea muy fácil de iterar sobre cada fila:¿Cómo puedo omitir la fila del encabezado cuando leo un archivo CSV en Ruby? clase

CSV.foreach(file) { |row| puts row } 

Sin embargo, esto siempre incluye la fila de encabezado, por lo que obtendrá como salida:

header1, header2 
foo, bar 
baz, yak 

no lo hago querer los encabezados sin embargo. Ahora, cuando llamo ...

CSV.foreach(file, :headers => true) 

puedo obtener este resultado:

#<CSV::Row:0x10112e510 
    @header_row = false, 
    attr_reader :row = [ 
     [0] [ 
      [0] "header1", 
      [1] "foo" 
     ], 
     [1] [ 
      [0] "header2", 
      [1] "bar" 
     ] 
    ] 
> 

Por supuesto, debido a que la documentación dice:

Esta configuración hace que #shift para volver filas como CSV: : Objetos de fila en lugar de matrices

Pero, cómo puede Me salteo la fila del encabezado, devolviendo la fila como una matriz simple? No quiero que se devuelva el objeto complicado CSV::Row.

Definitivamente no quiero hacer esto:

first = true 
CSV.foreach(file) do |row| 
    if first 
    puts row 
    first = false 
    else 
    # code for other rows 
    end 
end 
+0

check http://stackoverflow.com/a/37856698/473040 – equivalent8

Respuesta

12

Mira #shift desde CSV Clase:

El método de lectura principal de envuelta Cuerdas y OI, una sola fila se tira de la fuente de datos, analiza y se devuelve como un array de campos (si no se utilizan filas de encabezado)

un ejemplo:

require 'csv' 

# CSV FILE 
# name, surname, location 
# Mark, Needham, Sydney 
# David, Smith, London 

def parse_csv_file_for_names(path_to_csv) 
    names = [] 
    csv_contents = CSV.read(path_to_csv) 
    csv_contents.shift 
    csv_contents.each do |row| 
    names << row[0] 
    end 
    return names 
end 
+0

CSV.read devuelve una matriz y #shift son los métodos predeterminados para la matriz. y correctamente muy útil aquí. – PriteshJ

+0

También puede repetir usando 'each_with_index' y verificar en qué índice de línea se encuentra. A 'next if (i == 0)' omitiría la primera línea para el índice 'i'. – tadman

+0

@tadman Siéntase libre de publicarlo como una respuesta separada: parece viable. – slhck

10

Es posible que desee considerar CSV.parse(csv_file, { :headers => false }) y pasando un bloque, como se ha mencionado here

+1

nota: esto solo funciona desde Ruby 1.9 – inger

+8

nota adicional: si está utilizando ocodo

6

una manera fresca de ignorar las cabeceras es leerlo como una matriz y pasar por alto la primera fila:

data = CSV.read("dataset.csv")[1 .. -1] 
# => [["first_row", "with data"], 
     ["second_row", "and more data"], 
     ... 
     ["last_row", "finally"]] 

El El problema con el enfoque :headers => false es que CSV no intentará leer la primera fila como un encabezado, sino que la considerará parte de los datos. Entonces, básicamente, tienes una primera fila inútil.

Cuestiones relacionadas