Cómo Leer y Analizar Archivos CSV con Ruby

CSV significa «Valores Separados por comas».

Es un formato de datos común que consiste en filas con valores separados por comas. Se utiliza para exportar & importar datos.

Por ejemplo:

Puede exportar sus contactos de Gmail como un archivo CSV, y también puede importarlos con el mismo formato.

Así es como se ve un archivo CSV:

id,name1,chocolate2,bacon3,apple4,banana5,almonds

Ahora aprenderás a usar la biblioteca CSV de Ruby para leer & escribir archivos CSV.

Análisis CSV de Ruby

Ruby viene con una biblioteca CSV incorporada.

Puede leer un archivo directamente:

require 'csv'CSV.read("favorite_foods.csv")

O puede analizar una cadena con datos CSV:

require 'csv'CSV.parse("1,chocolate\n2,bacon\n3,apple")

¿El resultado?

Se obtiene una matriz bidimensional en la que cada entrada es una fila de la tabla.

Se ve así:

, , , , , ]

Puede utilizar índices de matriz como data para trabajar con estos datos.

Pero hay una manera mejor!

Opciones de CSV

Si el archivo tiene encabezados, puede indicarle al analizador de CSV que los use.

table = CSV.parse(File.read("cats.csv"), headers: true)

Ahora, en lugar de una matriz multidimensional, obtiene un objeto de tabla CSV.

Aquí está la descripción:

«A CSV::Table es una estructura de datos bidimensional para representar documentos CSV. Las tablas le permiten trabajar con los datos por fila o columna, manipular los datos e incluso convertir los resultados en CSV.»

Dada una de estas tablas, puede obtener los datos que necesita de cualquier fila.

Ejemplo:

table# "1"table# "chocolate"

Aquí 0 es la primera fila, id & name son los nombres de las columnas.

Hay dos modos de:

  • by_col
  • by_row

Al cambiar el modo de tabla (row de forma predeterminada) puede ver los datos desde diferentes ángulos.

Por ejemplo:

table.by_col# table.by_col# 

Aquí 0 es la primera columna, 1 es la segunda columna.

Estos dos métodos devuelven una copia de la tabla.

Si desea realizar cambios en la tabla original, puede usar los métodos by_col! & by_row!.

Esto va a ser más eficiente en memoria porque no se crea ninguna copia de la tabla.

Cómo usar convertidores CSV

Es posible que haya notado que tenemos nuestra columna id como una matriz de cadenas.

¿Y si necesitamos enteros?

Usted puede obtener llamando to_i en cada cadena…

Pero hay un atajo!

La biblioteca Ruby CSV implementa algo llamado convertidores.

Un convertidor transformará automáticamente los valores para usted.

Por ejemplo:

CSV.parse("1,2,3,4,5")# ]CSV.parse("1,2,3,4,5", converters: :numeric)# ]

Hay 6 convertidores integrados:

  • Integer
  • Float
  • Numeric (Float + Integer)
  • Fecha
  • DateTime
  • Todos

Pero usted también puede crear sus propios convertidores.

Aquí está cómo:

CSV::Converters = ->(value) { value.to_sym rescue value }

Puede usar su nuevo convertidor de esta manera:

CSV.parse("a,b,c", headers: false, converters: :symbol)# ]

Cómo crear un nuevo archivo CSV

Además de poder analizar & leer archivos CSV de diferentes maneras, también puede crear un CSV desde cero.

Esta es la manera fácil:

cats = , , ]cats.map { |c| c.join(",") }.join("\n")

También puede utilizar el método generate :

CSV.generate do |csv| csv 

This prepares the data to be in the right format.

If you want to write to a file you'll have to use something like , or instead of you can use with a file name & write mode enabled.

CSV.open("cats.csv", "w") do |csv| csv 

Now you have a new CSV file!

CSV Gems & Performance

The built-in library is fine & it will get the job done.

But you can also find a few CSV parsing gems with different features.

For example, the gem will convert your CSV data into an array of hashes.

Example:

require 'smarter_csv'IntegerConverter = Object.newdef IntegerConverter.convert(value) Integer(value)endSmarterCSV.process('testing.csv', value_converters: { id: IntegerConverter })# 

Aquí hay una comparación de rendimiento:

Comparison: CSV: 112.9 i/sSmarter CSV: 21.7 i/s - 5.21x slower Tabular: 17.3 i/s - 6.52x slower

Resumen

¡Has aprendido a leer & escribir archivos CSV en Ruby! También ha aprendido sobre convertidores & gemas Ruby alternativas para procesar sus datos CSV.

Si desea procesar archivos CSV grandes (> 10MB), puede usar el método CSV.foreach(file_name) con un bloque. Esto leerá una fila a la vez & usa mucha menos memoria.

Por favor, comparta este artículo para que más personas puedan encontrarlo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.