Come leggere e analizzare i file CSV con Ruby

CSV sta per “Valori separati da virgole”.

È un formato di dati comune costituito da righe con valori separati da virgole. Viene utilizzato per esportare & importare dati.

Ad esempio:

Puoi esportare i tuoi contatti Gmail come file CSV e puoi anche importarli usando lo stesso formato.

Questo è l’aspetto di un file CSV:

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

Ora imparerai come utilizzare la libreria CSV di Ruby per leggere & scrivere file CSV.

Ruby CSV Parsing

Ruby viene fornito con una libreria CSV integrata.

È possibile leggere un file direttamente:

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

Oppure puoi analizzare una stringa con dati CSV:

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

Il risultato?

Si ottiene un array bidimensionale in cui ogni voce è una riga nella tabella.

Assomiglia a questo:

, , , , , ]

È possibile utilizzare indici di array come data per lavorare con questi dati.

Ma c’è un modo migliore!

Opzioni CSV

Se il tuo file ha intestazioni puoi dire al parser CSV di usarle.

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

Ora invece di un array multidimensionale si ottiene un oggetto Tabella CSV.

Ecco la descrizione:

“A CSV::Table è una struttura dati bidimensionale per la rappresentazione di documenti CSV. Le tabelle consentono di lavorare con i dati per riga o colonna, manipolare i dati e persino convertire i risultati in CSV.”

Data una di queste tabelle, è possibile ottenere i dati necessari da qualsiasi riga.

Esempio:

table# "1"table# "chocolate"

Qui 0 è la prima riga, id & name sono i nomi delle colonne.

Ci sono due modalità di tabella:

  • by_col
  • by_row

Modificando la modalità tabella (row per impostazione predefinita) è possibile guardare i dati da diverse angolazioni.

Per esempio:

table.by_col# table.by_col# 

Qui 0 è la prima colonna, 1 è la seconda colonna.

Questi due metodi restituiscono una copia della tabella.

Se si desidera apportare modifiche alla tabella originale, è possibile utilizzare i metodi by_col! & by_row!.

Questo sarà più efficiente in termini di memoria perché non viene creata alcuna copia della tabella.

Come usare i convertitori CSV

Potresti aver notato che abbiamo ottenuto la nostra colonna id come una matrice di stringhe.

Cosa succede se abbiamo bisogno di numeri interi?

Puoi ottenerli chiamando to_isu ogni stringa

Ma c’è una scorciatoia!

La libreria Ruby CSV implementa qualcosa chiamato convertitori.

Un convertitore trasformerà automaticamente i valori per te.

Per esempio:

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

Ci sono 6 convertitori incorporati:

  • Integer
  • Float
  • Numeric (Float + Integer)
  • Date
  • DateTime
  • All

Ma puoi anche creare i tuoi convertitori personalizzati.

Ecco come:

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

Puoi usare il tuo nuovo convertitore in questo modo:

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

Come creare un nuovo file CSV

Oltre ad essere in grado di analizzare & leggere i file CSV in modi diversi, puoi anche creare un CSV da zero.

Questo è il modo più semplice:

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

È inoltre possibile utilizzare il metodo 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 })# 

Ecco un confronto delle prestazioni:

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

Sommario

Hai imparato a leggere & scrivere file CSV in Ruby! Hai anche imparato a conoscere i convertitori & gemme Ruby alternative per elaborare i tuoi dati CSV.

Se si desidera elaborare file CSV di grandi dimensioni (> 10 MB), è possibile utilizzare il metodo CSV.foreach(file_name) con un blocco. Questo leggerà una riga alla volta & usa molta meno memoria.

Si prega di condividere questo articolo in modo che più persone possono trovarlo!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.