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| csvThis 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| csvNow 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 slowerResumen
¡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.