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