CSV-bestanden lezen en ontleden met Ruby

CSV staat voor “door komma’ s gescheiden waarden”.

het is een gemeenschappelijk gegevensformaat dat bestaat uit rijen met waarden gescheiden door komma ‘ s. Het wordt gebruikt voor het exporteren van & importeren van gegevens.

bijvoorbeeld:

u kunt uw Gmail-contacten exporteren als een CSV-bestand, en u kunt ze ook importeren in hetzelfde formaat.

zo ziet een CSV-bestand eruit:

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

nu ga je leren hoe je de Ruby CSV library kunt gebruiken om & CSV-bestanden te lezen.

Ruby CSV-Parsing

Ruby wordt geleverd met een ingebouwde CSV-bibliotheek.

u kunt een bestand direct lezen:

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

of u kunt een tekenreeks ontleden met CSV-gegevens:

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

het resultaat?

u krijgt een tweedimensionale array waarin elke regel één rij in de tabel is.

het ziet er zo uit:

, , , , , ]

u kunt array-indices zoals data gebruiken om met deze gegevens te werken.

maar er is een betere manier!

CSV-opties

als uw bestand headers bevat, kunt u de CSV-parser vertellen deze te gebruiken.

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

in plaats van een multidimensionale array krijgt u nu een CSV Table object.

hier is de beschrijving:

“een CSV::Table is een tweedimensionale gegevensstructuur voor het weergeven van CSV-documenten. Met tabellen kunt u met de gegevens per rij of kolom werken, de gegevens manipuleren en zelfs de resultaten naar CSV converteren.”

gegeven een van deze tabellen, kunt u de gegevens die u nodig hebt uit elke rij.

voorbeeld:

table# "1"table# "chocolate"

hier is 0 de eerste rij, id & name zijn de kolomnamen.

er zijn twee tabelmodi:

  • by_col
  • by_row

door de tabelmodus te wijzigen (row standaard) kunt u de gegevens vanuit verschillende hoeken bekijken.

bijvoorbeeld:

table.by_col# table.by_col# 

hier is 0 de eerste kolom, 1 de tweede kolom.

deze twee methoden geven een kopie van de tabel terug.

als u de oorspronkelijke tabel wilt wijzigen, kunt u de methoden by_col! & by_row! gebruiken.

dit zal geheugenefficiënter zijn omdat er geen kopie van de tabel wordt gemaakt.

hoe CSV Converters

te gebruiken het is u wellicht opgevallen dat we onze id kolom hebben gekregen als een array van strings.

wat als we gehele getallen nodig hebben?

u kunt ze krijgen door to_i op elke tekenreeks aan te roepen…

maar er is een sneltoets!

de Ruby CSV bibliotheek implementeert iets genaamd converters.

een converter zal automatisch waarden voor u transformeren.

bijvoorbeeld:

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

er zijn 6 ingebouwde converters:

  • Integer
  • Float
  • numeriek (Float + Integer)
  • Datum
  • DateTime
  • alle

maar u kunt ook uw eigen aangepaste converters maken.

dit is hoe:

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

u kunt uw nieuwe converter zo gebruiken:

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

Hoe maak je een nieuw CSV-bestand

bovenop het feit dat je & CSV-bestanden op verschillende manieren kunt ontleden, kun je ook een CSV vanuit het niets aanmaken.

dit is de gemakkelijke manier:

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

u kunt ook de generate methode gebruiken:

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

hier is een prestatievergelijking:

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

samenvatting

u hebt geleerd hoe u & kunt lezen CSV-bestanden schrijven in Ruby! U hebt ook geleerd over converters & alternatieve Ruby edelstenen om uw CSV-gegevens te verwerken.

als u grote CSV-bestanden (> 10MB) wilt verwerken, kunt u de methode CSV.foreach(file_name) met een blok gebruiken. Dit leest een rij tegelijk & en gebruikt veel minder geheugen.

deel dit artikel zodat meer mensen het kunnen vinden!

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.