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| 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 præstationssammenligning:
Comparison: CSV: 112.9 i/sSmarter CSV: 21.7 i/s - 5.21x slower Tabular: 17.3 i/s - 6.52x slowerResume
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!