miten lukea & jäsentää CSV-tiedostoja Ruby

CSV tarkoittaa ”pilkulla erotettuja arvoja”.

se on yleinen tietomuoto, joka koostuu riveistä, joiden arvot on erotettu pilkuilla. Sitä käytetään tietojen viemiseen & tuomiseen.

esimerkiksi:

voit viedä Gmail-yhteystietosi CSV-tiedostona, ja voit myös tuoda ne samassa muodossa.

tältä näyttää CSV-tiedosto:

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

Nyt opit käyttämään Ruby CSV-kirjastoa lukemaan & kirjoittamaan CSV-tiedostoja.

Ruby CSV jäsennys

Rubyssa on sisäänrakennettu CSV-kirjasto.

voit lukea tiedoston suoraan:

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

tai voit jäsentää merkkijonon CSV-tiedoilla:

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

mikä oli tulos?

saadaan kaksiulotteinen joukko, jossa jokainen merkintä on yksi rivi taulukossa.

se näyttää tältä:

, , , , , ]

voit käyttää array-indeksejä, kuten data, työstääksesi näitä tietoja.

mutta on parempikin tapa!

CSV-Asetukset

jos tiedostossasi on otsikoita, voit pyytää CSV-jäsentäjää käyttämään niitä.

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

nyt moniulotteisen matriisin sijaan saa CSV-taulukon objektin.

tässä kuvaus:

”A CSV::Table on kaksiulotteinen tietorakenne CSV-dokumenttien esittämiseen. Taulukoiden avulla voit käsitellä tietoja rivi-tai sarakkeittain, manipuloida tietoja ja jopa muuntaa tulokset takaisin CSV: ksi.”

koska yksi näistä taulukoista, voit saada tarvitsemasi tiedot mistä tahansa rivistä.

esimerkki:

table# "1"table# "chocolate"

tässä 0 on ensimmäinen rivi, id & name palstojen nimet.

taulukkomuotoja on kaksi:

  • by_col
  • by_row

taulukkotilaa vaihtamalla (row oletuksena) tietoja voi tarkastella eri näkökulmista.

esimerkiksi:

table.by_col# table.by_col# 

tässä 0 on ensimmäinen sarake, 1 on toinen sarake.

nämä kaksi menetelmää palauttavat kopion taulukosta.

jos haluat tehdä muutoksia alkuperäiseen taulukkoon, voit käyttää by_col! & by_row! menetelmiä.

tämä tulee olemaan muistitehokkaampaa, koska taulukosta ei luoda kopiota.

kuinka käyttää CSV-muuntimia

olet ehkä huomannut, että saimme id – sarakkeemme rivistönä.

mitä jos tarvitaan kokonaislukuja?

saat ne soittamalla to_i jokaiselle merkkijonolle …

mutta Oikotie on olemassa!

Ruby CSV-kirjasto toteuttaa jotain niin sanottuja muuntimia.

muunnin muuttaa arvot automaattisesti puolestasi.

esimerkiksi:

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

on 6 sisäänrakennettu muuntimet:

  • kokonaisluku
  • Float
  • numeerinen (Float + kokonaisluku)
  • Date
  • DateTime
  • kaikki

mutta voit myös luoda omia muokattuja muuntimia.

näin:

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

voit käyttää uutta Muuntimen näin:

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

Kuinka luoda uusi CSV-tiedosto

sen lisäksi, että pystyy jäsentämään & lukemaan CSV-tiedostoja eri tavoin, voit myös luoda CSV: n tyhjästä.

tämä on helppo tie:

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

voit käyttää myös generate – menetelmää:

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 })# 

tässä suoritusvertailu:

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

Yhteenveto

olet oppinut lukemaan & kirjoittamaan CSV-tiedostoja Rubyssa! Olet myös oppinut muuntimet & vaihtoehtoisia Ruby helmiä käsitellä CSV tietoja.

jos haluat käsitellä isoja CSV-tiedostoja (> 10MB), voit käyttää CSV.foreach(file_name) - menetelmää lohkolla. Tämä lukee rivi kerrallaan & käytä paljon vähemmän muistia.

Jaa tämä artikkeli, jotta useammat ihmiset löytävät sen!

Vastaa

Sähköpostiosoitettasi ei julkaista.