Sådan læses og analyseres CSV-filer med Ruby

CSV står for “kommaseparerede værdier”.

det er et almindeligt dataformat, der består af rækker med værdier adskilt af kommaer. Det bruges til at eksportere & importere data.

for eksempel:

du kan eksportere dine Gmail-kontakter som en CSV-fil, og du kan også importere dem i samme format.

Sådan ser en CSV-fil ud:

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

nu skal du lære at bruge Ruby CSV-biblioteket til at læse & skrive CSV-filer.

Ruby CSV Parsing

Ruby leveres med et indbygget CSV-bibliotek.

du kan læse 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 et todimensionelt array, hvor hver post er en række i tabellen.

det ser sådan ud:

, , , , , ]

du kan bruge array indekser som data til at arbejde med disse data.

men der er en bedre måde!

CSV-indstillinger

hvis din fil har overskrifter, kan du bede CSV-parseren om at bruge dem.

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

nu i stedet for et multidimensionelt array får du et CSV-Bordobjekt.

her er beskrivelsen:

“en CSV::Table er en todimensionel datastruktur til repræsentation af CSV-dokumenter. Tabeller giver dig mulighed for at arbejde med dataene efter række eller kolonne, manipulere dataene og endda konvertere resultaterne tilbage til CSV.”

i betragtning af en af disse tabeller kan du få de data, du har brug for, fra enhver række.

eksempel:

table# "1"table# "chocolate"

her 0 er den første række, id & name er kolonnenavne.

der er to bordtilstande:

  • by_col
  • by_række

ved at ændre tabeltilstanden (row som standard) kan du se på dataene fra forskellige vinkler.

for eksempel:

table.by_col# table.by_col# 

her 0 er den første kolonne, 1 er den anden kolonne.

disse to metoder returnerer en kopi af tabellen.

hvis du vil foretage ændringer i den oprindelige tabel, kan du bruge by_col! & by_row! metoderne.

dette bliver mere hukommelseseffektivt, fordi der ikke oprettes nogen kopi af tabellen.

Sådan bruges CSV-konvertere

du har måske bemærket, at vi fik vores id kolonne som en række strenge.

hvad hvis vi har brug for heltal?

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

men der er en genvej!

Ruby CSV-biblioteket implementerer noget, der hedder konvertere.

en konverter vil automatisk omdanne værdier for dig.

for eksempel:

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

der er 6 indbyggede konvertere:

  • heltal
  • flyde
  • numerisk (flyde + heltal)
  • Dato
  • DateTime
  • alle

men du kan også oprette dine egne brugerdefinerede konvertere.

her er hvordan:

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

du kan bruge din nye konverter som denne:

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

Sådan oprettes en ny CSV-fil

ud over at kunne analysere & Læs CSV-filer på forskellige måder kan du også oprette en CSV fra bunden.

dette er den nemme måde:

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

du kan også bruge generate – metoden:

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 præstationssammenligning:

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

Resume

du har lært at læse & skriv CSV-filer i Ruby! Du har også lært om konvertere & alternative Ruby gems til at behandle dine CSV-data.

hvis du vil behandle store CSV-filer (> 10MB), kan du bruge CSV.foreach(file_name) - metoden med en blok. Dette vil læse en række ad gangen & brug meget mindre hukommelse.

del venligst denne artikel, så flere mennesker kan finde den!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.