Lesen und Analysieren von CSV-Dateien mit Ruby

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

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 slower

Zusammenfassung

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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.