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_i
su 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| 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 })#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 slowerSommario
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!