2012-10-03 71 views
9

He estado haciendo algunas pruebas con CSV.table. Tengo dos archivos CSV pequeños y casi idénticos, pero a uno le falta la fila del encabezado.Ruby 1.9.3 - ¿Cómo sabe CSV.table si no hay encabezados en un archivo CSV?

Cuando ejecuto CSV.table en el archivo CSV con la fila del encabezado, todo funciona como se esperaba.

Cuando corro contra el archivo CSV sin la fila de cabecera me sale:

NoMethodError: undefined method `encode' for nil:NilClass 

He intentado esto con diferentes tipos de datos, con diferentes tipos de cabeceras, y obtener los mismos resultados.

Tengo curiosidad por la magia de CSV.table. Si utilizo CSV.parse con los encabezados configurados en verdadero, siempre hace que la primera fila sea encabezados sin importar qué. Entonces, he estado usando CSV.table para verificar si un archivo CSV que se está importando tiene una fila de encabezado, pero no estoy muy cómodo con esto porque no entiendo si o cuándo funcionará o no del modo en que lo estoy usando.

begin 
    CSV.table(csv_file_path) 
rescue 
    # Add error to log or something. 
end 

¿Alguien lo sabe?

P.S. Ya he leído esto y el código fuente que proporciona en cada método - http://www.ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html

Respuesta

9

No hay ninguna magia involucrada, y no funcionará para usted en general.

Como puedes ver from the source, table literalmente solo llama a read con headers: true. Pero también convierte el encabezado en símbolos (header_converters: :symbol) y esta es la clave de por qué parece funcionar.

Obtiene un error sin encabezados porque tiene una columna en blanco en su primera fila de datos (algo así como a,b,,d,e). El blanco se lee como nil, y como nil no se puede convertir en un símbolo, explota.

Pruébalo con algunos datos que no tienen un espacio en blanco en la primera fila; verás que table tratará esa fila de datos como encabezados al igual que cualquiera de los otros métodos.

+0

Gracias @ andy-h Tuve una situación similar cuando ejecuto 'contents = CSV.open" languages.csv ", encabezados: true, header_converters:: symbol' Obtuve este error:' undefined method 'encode' for nil : NilClass (NoMethodError) '. Se queja del método 'header_converter:: symbol'. Después de revisar el archivo "languages.csv", encontré que el encabezado comienza con "" un espacio. Eliminar ese espacio resolvió ese problema. – egyamado

+0

** Corrección. ** Quise decir que me faltaba un espacio en la primera fila '", nombre, dirección, .... "' cuando agregué espacio como '', nombre, dirección, ... "' Pude ejecutar mi código. – egyamado

Cuestiones relacionadas