cum să citiți și să analizați fișierele CSV cu Ruby

CSV înseamnă „valori separate prin virgulă”.

este un format de date comun care constă din rânduri cu valori separate prin virgule. Este folosit pentru exportul & importul de date.

de exemplu:

puteți exporta contactele Gmail ca fișier CSV și le puteți importa folosind același format.

așa arată un fișier CSV:

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

acum veți învăța cum să utilizați Biblioteca Ruby CSV pentru a citi & scrie fișiere CSV.

analiza Ruby CSV

Ruby vine cu o bibliotecă CSV încorporată.

puteți citi un fișier direct:

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

sau puteți analiza un șir cu date CSV:

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

rezultatul?

obțineți o matrice bidimensională în care fiecare intrare este un rând în tabel.

se pare ca acest lucru:

, , , , , ]

puteți utiliza indici de matrice precum data pentru a lucra cu aceste date.

dar există o cale mai bună!

opțiuni CSV

Dacă fișierul dvs. are anteturi, puteți spune analizorului CSV să le folosească.

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

acum, în loc de o matrice multidimensională, obțineți un obiect de tabel CSV.

Iată descrierea:

„a CSV::Table este o structură de date bidimensională pentru reprezentarea documentelor CSV. Tabelele vă permit să lucrați cu datele pe rând sau coloană, să manipulați datele și chiar să convertiți rezultatele înapoi în CSV.”

având în vedere unul dintre aceste tabele, puteți obține datele de care aveți nevoie din orice rând.

exemplu:

table# "1"table# "chocolate"

aici 0 este primul rând, id & name sunt numele coloanelor.

există două moduri de tabel:

  • by_col
  • by_row

schimbând modul Tabel (row implicit) puteți privi datele din unghiuri diferite.

de exemplu:

table.by_col# table.by_col# 

aici 0 este prima coloană, 1 este a doua coloană.

aceste două metode returnează o copie a tabelului.

dacă doriți să faceți modificări la tabelul original, atunci puteți utiliza by_col! & by_row! metode.

aceasta va fi mai eficientă din punct de vedere al memoriei, deoarece nu este creată nicio copie a tabelului.

cum se utilizează convertoarele CSV

este posibil să fi observat că avem coloana id ca o serie de șiruri de caractere.

ce se întâmplă dacă avem nevoie de numere întregi?

le puteți obține apelând to_i pe fiecare șir…

dar există o scurtătură!

Biblioteca Ruby CSV implementează ceva numit convertoare.

un convertor va transforma automat valorile pentru dvs.

de exemplu:

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

există 6 convertoare încorporate:

  • Integer
  • Float
  • Numeric (Float + Integer)
  • Data
  • DateTime
  • toate

dar puteți crea, de asemenea, propriile convertoare personalizate.

Iată cum:

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

puteți utiliza noul dvs. convertor astfel:

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

cum se creează un nou fișier CSV

pe lângă posibilitatea de a analiza & citiți fișierele CSV în diferite moduri, puteți crea, de asemenea, un CSV de la zero.

aceasta este calea ușoară:

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

de asemenea, puteți utiliza metoda 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 })# 

iată o comparație a performanței:

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

rezumat

ați învățat cum să citiți & scrieți fișiere CSV în Ruby! De asemenea, ați aflat despre convertoare & pietre Ruby alternative pentru a vă procesa datele CSV.

dacă doriți să procesați fișiere CSV mari (> 10 MB), poate doriți să utilizați metoda CSV.foreach(file_name) cu un bloc. Acest lucru va citi un rând la un moment dat & utilizați mult mai puțină memorie.

vă rugăm să partajați acest articol astfel încât mai multe persoane pot găsi!

Lasă un răspuns

Adresa ta de email nu va fi publicată.