La mejor manera de leer CSV en Ruby. FasterCSV?

Tengo un archivo CSV que quiero leer con Ruby y crear objetos de Ruby para insertar en una base de datos MySQL con Active Record. ¿Cuál es la mejor manera de hacer esto? Veo dos opciones claras: FasterCSV y el CSV de Ruby Core . ¿Cual es mejor? ¿Hay una mejor opción que me estoy perdiendo?

EDITAR: Gareth dice que use FasterCSV, entonces, ¿cuál es la mejor manera de leer un archivo CSV usando FasterCSV? Al mirar la documentación, veo métodos llamados parse , foreach , read , open … Dice que foreach “está pensado como la interfaz principal para leer archivos CSV”. Entonces, ¿supongo que debería usar ese?

Ruby 1.9 adoptó FasterCSV como su procesador CSV central , por lo que diría que definitivamente es mejor ir a FasterCSV, incluso si todavía está usando Ruby 1.8

Si tiene muchos registros para importar, es posible que desee utilizar el cargador de MySQL . Va a ser extremadamente rápido.

LOAD DATA INFILE se puede usar para leer archivos obtenidos de fonts externas. Por ejemplo, muchos progtwigs pueden exportar datos en formato de valores separados por comas (CSV), de modo que las líneas tienen campos separados por comas y entre comillas dobles, con una línea inicial de nombres de columna. Si las líneas en un archivo de este tipo terminan con pares de retorno de carro / nueva línea, la statement que se muestra aquí ilustra las opciones de manejo de campo y línea que usaría para cargar el archivo:

 LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES; 

Si los valores de entrada no están necesariamente encerrados entre comillas, use OPCIONALMENTE antes de las palabras clave ENCLOSED BY.

Use eso para juntar todo en una tabla temporal, luego use ActiveRecord para ejecutar consultas en su contra para eliminar registros que no desea, luego copie desde la tabla temporal a su tabla de producción, luego suelte o trunque la temperatura temporal. O, use ActiveRecord para buscar en la tabla temporal y copiar los registros a producción, luego suelte o trunque la temperatura. Incluso podría hacer una copia de tabla a tabla dentro de MySQL o adjuntar una tabla a otra.

Va a ser difícil superar la velocidad del cargador dedicado, y usar el mecanismo de consulta de la base de datos para procesar registros de forma masiva. El paso de convertir un registro en el archivo CSV en un objeto, y luego usar el ORM para escribirlo en la base de datos agrega una gran cantidad de sobrecarga adicional, por lo que a menos que tenga algunas validaciones súper difíciles que requieran la lógica de Ruby, será más rápido. a la base de datos.


EDIT: Aquí hay un ejemplo simple de asignador de columna de encabezado CSV a base de datos:

 require "csv" data = < 'col1', 'header2' => 'col2', 'header 3' => 'col3' } arr_of_arrs = CSV.parse(data) headers = arr_of_arrs.shift.map{ |i| i.strip } db_cols = header_to_table_columns.values_at(*headers) arr_of_arrs.each do |ary| # insert into the database using an ORM or by creating insert statements end