CSV steht für „Comma-Separated Values“.
Es ist ein gängiges Datenformat, das aus Zeilen besteht, deren Werte durch Kommas getrennt sind. Es wird zum Exportieren von & Datenimporten verwendet.
Beispiel:
Sie können Ihre Google Mail-Kontakte als CSV-Datei exportieren und im selben Format importieren.
So sieht eine CSV-Datei aus:
id,name1,chocolate2,bacon3,apple4,banana5,almonds
Jetzt lernen Sie, wie Sie mit der Ruby CSV-Bibliothek & CSV-Dateien schreiben.
Ruby CSV Parsing
Ruby verfügt über eine integrierte CSV-Bibliothek.
Sie können eine Datei direkt lesen:
require 'csv'CSV.read("favorite_foods.csv")
Oder Sie können eine Zeichenfolge mit CSV-Daten analysieren:
require 'csv'CSV.parse("1,chocolate\n2,bacon\n3,apple")
Das Ergebnis?
Sie erhalten ein zweidimensionales Array, in dem jeder Eintrag eine Zeile in der Tabelle ist.
Es sieht so aus:
, , , , , ]
Sie können Array-Indizes wie data
verwenden, um mit diesen Daten zu arbeiten.
Aber es gibt einen besseren Weg!
CSV-Optionen
Wenn Ihre Datei Header enthält, können Sie dem CSV-Parser mitteilen, dass er sie verwenden soll.
table = CSV.parse(File.read("cats.csv"), headers: true)
Anstelle eines mehrdimensionalen Arrays erhalten Sie jetzt ein CSV-Tabellenobjekt.
Hier ist die Beschreibung:
“ A
CSV::Table
ist eine zweidimensionale Datenstruktur zur Darstellung von CSV-Dokumenten. Mit Tabellen können Sie mit den Daten nach Zeilen oder Spalten arbeiten, die Daten bearbeiten und sogar die Ergebnisse zurück in CSV konvertieren.“
In einer dieser Tabellen können Sie die benötigten Daten aus jeder Zeile abrufen.
Beispiel:
table# "1"table# "chocolate"
Hier ist 0
die erste Zeile, id
& name
sind die Spaltennamen.
Es gibt zwei Tabellenmodi:
- by_col
- by_row
Durch Ändern des Tabellenmodus (standardmäßig row
) können Sie die Daten aus verschiedenen Blickwinkeln betrachten.
Zum Beispiel:
table.by_col# table.by_col#
Hier ist 0
die erste Spalte, 1
die zweite Spalte.
Diese beiden Methoden geben eine Kopie der Tabelle zurück.
Wenn Sie Änderungen an der ursprünglichen Tabelle vornehmen möchten, können Sie die Methoden by_col!
& by_row!
verwenden.
Dies wird speichereffizienter sein, da keine Kopie der Tabelle erstellt wird.
Verwendung von CSV-Konvertern
Möglicherweise haben Sie bemerkt, dass wir unsere id
-Spalte als Array von Zeichenfolgen erhalten haben.
Was ist, wenn wir ganze Zahlen brauchen?
Sie können sie erhalten, indem Sie to_i
für jede Zeichenfolge aufrufen …
Aber es gibt eine Verknüpfung!
Die Ruby CSV-Bibliothek implementiert so genannte Konverter.
Ein Konverter wandelt Werte automatisch für Sie um.
Zum Beispiel:
CSV.parse("1,2,3,4,5")# ]CSV.parse("1,2,3,4,5", converters: :numeric)# ]
Es gibt 6 eingebaute Konverter:
- Integer
- Float
- Numerisch (Float + Integer)
- Datum
- DateTime
- Alle
Sie können aber auch Ihre eigenen benutzerdefinierten Konverter erstellen.
So geht’s:
CSV::Converters = ->(value) { value.to_sym rescue value }
Sie können Ihren neuen Konverter wie folgt verwenden:
CSV.parse("a,b,c", headers: false, converters: :symbol)# ]
So erstellen Sie eine neue CSV-Datei
Neben der Möglichkeit, & CSV-Dateien auf verschiedene Arten zu lesen, können Sie auch eine CSV-Datei von Grund auf neu erstellen.
Dies ist der einfache Weg:
cats = , , ]cats.map { |c| c.join(",") }.join("\n")
Sie können auch die Methode generate
verwenden:
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 ist ein Leistungsvergleich:
Comparison: CSV: 112.9 i/sSmarter CSV: 21.7 i/s - 5.21x slower Tabular: 17.3 i/s - 6.52x slowerZusammenfassung
Sie haben gelernt, & CSV-Dateien in Ruby zu lesen! Sie haben auch gelernt, wie & alternative Ruby-Edelsteine zur Verarbeitung Ihrer CSV-Daten verwendet.
Wenn Sie große CSV-Dateien (> 10 MB) verarbeiten möchten, können Sie die
CSV.foreach(file_name)
-Methode mit einem Block verwenden. Dadurch wird jeweils eine Zeile gelesen & verbraucht viel weniger Speicher.Bitte teile diesen Artikel, damit mehr Leute ihn finden können!