Slik Leser OG Analyserer DU CSV-Filer med Ruby

CSV står for «Kommaseparerte Verdier».

det er et vanlig dataformat som består av rader med verdier atskilt med komma. Den brukes til eksport & import av data.

for eksempel:

Du kan eksportere Gmail-kontaktene dine som EN CSV-fil, og du kan også importere Dem med samme format.

slik ser EN CSV-fil ut:

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

Nå skal du lære hvordan Du bruker Ruby CSV-biblioteket til å lese & skrive CSV-filer.

Ruby CSV-Parsing

Ruby leveres med et innebygd CSV-bibliotek.

du kan lese en fil direkte:

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

eller du kan analysere en streng MED CSV-data:

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

resultatet?

du får en todimensjonal matrise hvor hver oppføring er en rad i tabellen.

Det ser slik ut:

, , , , , ]

du kan bruke matriseindekser som data for å jobbe med disse dataene.

Men det er en bedre måte!

CSV-Alternativer

hvis filen har overskrifter, kan DU be CSV-parseren om å bruke DEM.

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

nå i stedet for et flerdimensjonalt array får DU ET CSV-Tabellobjekt.

her er beskrivelsen:

«En CSV::Table er en todimensjonal datastruktur for å representere CSV-dokumenter. Tabeller lar deg arbeide med dataene etter rad eller kolonne, manipulere dataene og til og med konvertere resultatene tilbake til CSV.»

Gitt en av disse tabellene, kan du få dataene du trenger fra en hvilken som helst rad.

Eksempel:

table# "1"table# "chocolate"

her 0 er den første raden, id & name er kolonnenavnene.

det er to tabellmoduser:

  • by_col
  • by_row

ved å endre tabellmodus (row som standard) kan du se på dataene fra forskjellige vinkler.

for eksempel:

table.by_col# table.by_col# 

her 0 er den første kolonnen, 1 er den andre kolonnen.

disse to metodene returnerer en kopi av tabellen.

hvis du vil gjøre endringer i den opprinnelige tabellen, kan du bruke metodene by_col! & by_row!.

Dette kommer til å bli mer minneeffektivt fordi ingen kopi av tabellen er opprettet.

SLIK Bruker DU CSV-Omformere

du har kanskje lagt merke til at vi fikk vår id kolonne som en rekke strenger.

Hva om Vi trenger Heltall?

du kan få dem ved å ringe to_i på hver streng…

Men det er en snarvei!

Ruby CSV-biblioteket implementerer noe som kalles omformere.

en omformer vil automatisk transformere verdier for deg.

for eksempel:

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

det er 6 innebygde omformere:

  • Heltall
  • Float
  • Numerisk (Float + Heltall)
  • Dato
  • DateTime
  • Alle

men du kan også lage dine egne tilpassede omformere.

Her er hvordan:

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

Du kan bruke din nye omformer som dette:

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

Hvordan Lage EN NY CSV-Fil

I tillegg til å kunne analysere & lese CSV-filer på forskjellige måter, kan du også lage EN CSV fra bunnen av.

Dette er den enkle måten:

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

du kan også bruke metoden 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 })# 

her er en ytelse sammenligning:

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

Sammendrag

Du har lært å lese & skriv CSV-filer i Ruby! Du har også lært om omformere & alternative Ruby gems for å behandle CSV-dataene dine.

hvis du vil behandle store CSV-filer (> 10 MB), vil du kanskje bruke metoden CSV.foreach(file_name) med en blokk. Dette vil lese en rad om gangen & bruk mye mindre minne.

del denne artikkelen slik at flere kan finne den!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.