[RUBY] Ein Skript, das Yaml aus CSV erstellt, um Anfangsdaten in Rails with Fixtures einzufügen

Es ist bekannt, dass die Methode zur Eingabe von Daten in die Rails-Datenbank darin besteht, eine Yaml-Datei für Fixtures zu erstellen und diese mit dem Befehl Rails einzugeben. In der Realität scheinen die Originaldaten jedoch häufig in Excel usw. aufbereitet und in CSV usw. verarbeitet zu werden. Ich habe auch Yaml Converter usw. ausprobiert, aber es hat nicht funktioniert, den Fixtures Key zu setzen, also habe ich es selbst gemacht. Ich habe das Escape-Zeichen überhaupt nicht verarbeitet. Wenn die Originaldaten so etwas verarbeiten, verarbeiten Sie es bitte entsprechend.

Angenommen, Sie haben eine solche CSV-Datei mit dem Spaltennamen in der ersten Zeile.

id,item,price
 1, Apfel, 100
 2, mikan, 80
 3, Banane, 60
 4, Melon, 2000
 5, Erdbeere, 300

Sie benötigen eine solche Yaml-Datei, um mit Fixtures umgehen zu können.

data1:
  id: 1
 Artikel: Apfel
  price: 100

data2:
  id: 2
 Artikel: Mikan
  price: 80

data3:
  id: 3
 Artikel: Banane
  price: 60

data4:
  id: 4
 Einzelteil: Melone
  price: 2000

data5:
  id: 5
 Artikel: Erdbeere
  price: 300

Die Stelle von "data1:" ist der Fixtures-Schlüssel, der nicht in der Datenbank angezeigt wird. Es scheint jedoch, dass Sie für jeden Datensatz einen eindeutigen Wert als Hash angeben müssen.

Das Skript sieht so aus. Nach der Konvertierung von Excel in CSV habe ich eine Stückliste in UTF-8 erhalten, sodass ich beim Öffnen der Datei eine Option habe.

!/use/bin/env ruby

filename = ARGV[0]

# Option zum Löschen der UTF-8-Stückliste
file = open(filename, 'r:BOM|UTF-8')

# Holen Sie sich die erste Zeile der CSV-Datei
column = file.gets.chomp.split(",")

# Fixtures Schlüsselpräfix (Daten) gefolgt von Zähler (num)
prefix = "data"
num = 1
str = ""

 file.each do |line|
 es sei denn, line.strip == "" ## Leerzeilen ignorieren
    str += "#{prefix}#{num}:\n"
     (0 .. column.length - 1).each do |i|
      str += "  #{column[i]}: #{line.chomp.split(",")[i]}\n"
    end
    str += "\n"
    num += 1
  end
end
print str

Es sieht so aus, wenn Sie von Shell aus laufen.

$ ./csv2yaml.rb fruits.csv > fruits.yml

Es gab kein Problem beim Konvertieren von CSV-Daten mit etwa 500 Zeilen, und es scheint in Ordnung zu sein, da sie von Fixtures importiert wurden. Ich konnte mehrere CSV-Dateien mit unterschiedlichen Spalten konvertieren.

Es kann einfacher sein, wenn Sie die Yaml-Bibliothek verwenden.

Recommended Posts

Ein Skript, das Yaml aus CSV erstellt, um Anfangsdaten in Rails with Fixtures einzufügen
[Rails] Erste Dateneingabe mit seed_fu!
[Rails 6] Zwei Methoden zur gleichzeitigen Eingabe mehrerer Bilder mit CarrierWave / (1) Eingabe mit anfänglichen Startdaten / (2) Import mit CSV
So speichern Sie gleichzeitig Daten in einem Modell, das einem verschachtelten Formular zugeordnet ist (Rails 6.0.0)
So erstellen Sie eine eindeutige Datenkombination in der Schienen-Zwischentabelle
Ich möchte mit Firestore von Rails spielen
Setup mit anfänglichen Testdaten, die in den Db2 / DB-Container eingefügt wurden
[So fügen Sie ein Video mit Rails in haml ein]
Abfragen von Arrays in jsonb mit Rails + postgres
Ich habe versucht, innerhalb von 3 Monaten einen Antrag von unerfahren zu stellen
Lassen Sie uns schreiben, wie API mit SpringBoot + Docker von 0 erstellt wird
Ich möchte die Pulldown-Menüelemente beim Senden eines Formulars in Rails in CSV importieren und aus den DB-Daten anzeigen.