[RUBY] Un script qui crée yaml à partir de CSV pour mettre les données initiales dans Rails with Fixtures

Il est bien connu que la méthode d'entrée des données dans la base de données Rails consiste à créer un fichier yaml pour les appareils et à le saisir avec la commande rails. Cependant, en réalité, il semble que les données d'origine soient souvent préparées dans Excel etc. et traitées en CSV etc. J'ai également essayé le convertisseur yaml, etc. mais cela n'a pas fonctionné pour mettre la clé des appareils, alors je l'ai fait moi-même. Je n'ai pas du tout traité le caractère d'échappement, donc si les données d'origine gèrent une telle chose, veuillez le traiter de manière appropriée.

Par exemple, supposons que vous ayez un fichier CSV comme celui-ci avec le nom de la colonne sur la première ligne.

id,item,price
 1, pomme, 100
 2, mikan, 80 ans
 3, banane, 60
 4, Melon, 2000
 5, fraise, 300

Vous aurez besoin d'un tel fichier yaml pour gérer les fixtures.

data1:
  id: 1
 article: pomme
  price: 100

data2:
  id: 2
 article: Mikan
  price: 80

data3:
  id: 3
 article: banane
  price: 60

data4:
  id: 4
 article: Melon
  price: 2000

data5:
  id: 5
 article: Fraise
  price: 300

La place de data1: est la clé fixtures, qui n'est pas reflétée dans la base de données, mais il semble que vous deviez donner une valeur unique comme hachage pour chaque enregistrement.

Le script ressemble à ceci. Après la conversion d'Excel en CSV, j'ai une nomenclature en UTF-8, j'ai donc une option lors de l'ouverture du fichier.

!/use/bin/env ruby

filename = ARGV[0]

# Option pour effacer la nomenclature UTF-8
file = open(filename, 'r:BOM|UTF-8')

# Obtenez la première ligne du fichier CSV
column = file.gets.chomp.split(",")

# préfixe de la touche fixtures (data) suivi du compteur (num)
prefix = "data"
num = 1
str = ""

 file.each do |line|
 sauf si line.strip == "" ## Ignorer les lignes vides
    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

Cela ressemble à ceci lors de l'exécution de Shell.

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

Il n'y a pas eu de problème pour convertir des données CSV d'environ 500 lignes, et cela semble correct car elles ont été importées par des appareils. J'ai pu convertir plusieurs fichiers CSV avec différentes colonnes.

Cela peut être plus facile à faire si vous utilisez la bibliothèque yaml.

Recommended Posts

Un script qui crée yaml à partir de CSV pour mettre les données initiales dans Rails with Fixtures
[Rails] Entrée de données initiale avec seed_fu!
[Rails 6] Deux méthodes pour saisir plusieurs images à la fois à l'aide de CarrierWave / (1) Saisie avec les données de départ initiales / (2) Importer avec CSV
Comment stocker simultanément des données dans un modèle associé à une forme imbriquée (Rails 6.0.0)
Comment créer une combinaison unique de données dans la table intermédiaire des rails
Je veux jouer avec Firestore de Rails
Configuration avec les données de test initiales insérées dans le conteneur Db2 / DB
[Comment insérer une vidéo dans un hameau avec Rails]
Comment interroger Array dans jsonb avec Rails + postgres
J'ai essayé de faire une demande en 3 mois d'inexpérimenté
Écrivons comment créer une API avec SpringBoot + Docker à partir de 0
Je souhaite importer les éléments du menu déroulant lors de la soumission d'un formulaire dans Rails en CSV et les afficher à partir des données de la base de données.