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| csvThis 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| csvNow 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 slowersamenvatting
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!