jak czytać i parsować pliki CSV za pomocą Ruby

CSV oznacza „wartości oddzielone przecinkami”.

jest to popularny format danych, który składa się z wierszy z wartościami oddzielonymi przecinkami. Służy do eksportowania & importowania danych.

na przykład:

możesz wyeksportować kontakty Gmaila jako plik CSV, a także zaimportować je w tym samym formacie.

tak wygląda plik CSV:

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

teraz nauczysz się jak używać biblioteki Ruby CSV do odczytu & zapisu plików CSV.

Ruby CSV parsowanie

Ruby pochodzi z wbudowaną biblioteką CSV.

możesz odczytać plik bezpośrednio:

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

możesz też parsować ciąg z danymi CSV:

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

wynik?

dostajesz dwuwymiarową tablicę, w której każdy wpis jest jednym wierszem w tabeli.

wygląda to tak:

, , , , , ]

do pracy z tymi danymi można użyć indeksów tablic, takich jak data.

ale jest lepszy sposób!

opcje CSV

Jeśli plik ma nagłówki, możesz powiedzieć parserowi CSV, aby ich używał.

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

teraz zamiast tablicy wielowymiarowej dostajesz obiekt tabeli CSV.

oto opis:

CSV::Table jest dwuwymiarową strukturą danych do reprezentowania dokumentów CSV. Tabele umożliwiają pracę z danymi według wiersza lub kolumny, manipulowanie danymi, a nawet konwertowanie wyników z powrotem do pliku CSV.”

biorąc pod uwagę jedną z tych tabel, możesz uzyskać potrzebne dane z dowolnego wiersza.

przykład:

table# "1"table# "chocolate"

tutaj 0 jest pierwszy wiersz, id & name są nazwami kolumn.

istnieją dwa tryby tabeli:

  • by_col
  • by_row

zmieniając tryb tabeli (row domyślnie), możesz spojrzeć na dane pod różnymi kątami.

na przykład:

table.by_col# table.by_col# 

tutaj 0 jest pierwszą kolumną, 1 jest drugą kolumną.

te dwie metody zwracają kopię tabeli.

jeśli chcesz wprowadzić zmiany w oryginalnej tabeli, możesz użyć metod by_col! & by_row!.

to będzie bardziej wydajne, ponieważ nie jest tworzona kopia tabeli.

jak używać konwerterów CSV

być może zauważyłeś, że otrzymaliśmy naszą kolumnę id jako tablicę łańcuchów.

co jeśli potrzebujemy liczb całkowitych?

możesz je uzyskać, wywołując to_i na każdym łańcuchu …

ale jest skrót!

Biblioteka Ruby CSV implementuje coś takiego jak konwertery.

konwerter automatycznie przekształci wartości dla Ciebie.

na przykład:

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

wbudowanych jest 6 konwerterów:

  • Integer
  • Float
  • Numeric (Float + Integer)
  • Date
  • DateTime
  • All

ale możesz także tworzyć własne niestandardowe Konwertery.

oto jak:

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

możesz użyć nowego konwertera w ten sposób:

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

Jak utworzyć nowy plik CSV

oprócz możliwości analizowania & odczytu plików CSV na różne sposoby można również utworzyć plik CSV od podstaw.

to jest prosty sposób:

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

Możesz również użyć metody 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 })# 

oto porównanie wyników:

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

podsumowanie

nauczyłeś się czytać & pisać pliki CSV w Ruby! Nauczyłeś się również o konwerterach & alternatywnych klejnotach Ruby do przetwarzania danych CSV.

jeśli chcesz przetwarzać duże pliki CSV (> 10 MB), możesz użyć metody CSV.foreach(file_name) z blokiem. To odczyta jeden wiersz na raz & zużywa dużo mniej pamięci.

podziel się tym artykułem, aby więcej osób mogło go znaleźć!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.