J'ai un fichier CSV appelé "A.csv". J'ai besoin de générer un nouveau fichier CSV appelé "B.csv" avec les données de "A.csv".
J'utiliserai un sous-ensemble de colonnes de "A.csv" et devra mettre à jour les valeurs d'une colonne avec de nouvelles valeurs dans "B.csv". En fin de compte, j'utiliserai ces données de B.csv pour valider par rapport à une base de données.
- Comment créer un nouveau fichier CSV?
- Comment copier les données des colonnes requises de A.csv vers "B.csv"?
- Comment ajouter des valeurs pour une colonne particulière?
Je suis nouveau sur Ruby, mais je suis capable de lire CSV pour obtenir un tableau ou un hachage.
Réponses:
Comme l'a souligné mikeb, il y a les documents - http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html - Ou vous pouvez suivre les exemples ci-dessous (tous sont testés et travail):
Pour créer un nouveau fichier:
Dans ce fichier, nous aurons deux lignes, une ligne d'en-tête et une ligne de données, CSV très simple:
require "csv" CSV.open("file.csv", "wb") do |csv| csv << ["animal", "count", "price"] csv << ["fox", "1", "$90.00"] end
résultat, un fichier appelé "file.csv" avec ce qui suit:
animal,count,price fox,1,$90.00
Comment ajouter des données à un CSV
Presque la même formule que ci-dessus seulement au lieu d'utiliser le mode "wb", nous utiliserons le mode "a +". Pour plus d'informations à ce sujet, consultez cette réponse sur le débordement de pile: Quels sont les modes et options Ruby File.open?
CSV.open("file.csv", "a+") do |csv| csv << ["cow", "3","2500"] end
Maintenant, lorsque nous ouvrons notre fichier.csv, nous avons:
animal,count,price fox,1,$90.00 cow,3,2500
Lisez notre fichier CSV
Vous savez maintenant copier et écrire dans un fichier, lire un CSV et donc récupérer les données pour une manipulation que vous venez de faire:
CSV.foreach("file.csv") do |row| puts row #first row would be ["animal", "count", "price"] - etc. end
Bien sûr, cela ressemble à une centaine de façons différentes d'extraire des informations d'un CSV à l'aide de ce joyau. Pour plus d'informations, je suggère de visiter la documentation maintenant que vous avez une introduction: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html
la source
Avez-vous vu la classe CSV de Ruby? Cela semble assez complet. Découvrez-le ici: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html
la source
Vous voudrez probablement l'utiliser
CSV::parse
pour aider Ruby à comprendre votre CSV en tant que tableau de données et permettre un accès facile aux valeurs par en-tête.Malheureusement, la documentation
CSV::parse
disponible sur la méthode n'indique pas très clairement comment l'utiliser à cette fin.J'ai eu une tâche similaire et j'ai été beaucoup plus aidé par Comment lire et analyser des fichiers CSV avec Ruby sur rubyguides.com que par la documentation de la classe CSV ou par les réponses qui y pointent.
Je recommande de lire cette page dans son intégralité. La partie cruciale consiste à transformer un CSV donné en un
CSV::Table
objet en utilisant:table = CSV.parse(File.read("cats.csv"), headers: true)
Maintenant, il y a de la documentation sur la
CSV::Table
classe , mais encore une fois, les exemples clairs sur la page rubyguides.com pourraient vous aider davantage. Une chose que je vais souligner est que lorsque vous dites.parse
d'attendre des en-têtes, le tableau résultant traitera la première ligne de données comme une ligne[0]
.Vous serez probablement particulièrement intéressé par la
.by_col
méthode disponible pour votre nouvelTable
objet. Cela vous permettra d'itérer à travers différentes positions d'index de colonne dans l'entrée et / ou la sortie et de copier de l'une à l'autre ou d'ajouter une nouvelle valeur à la sortie. Si je le fais fonctionner, je reviendrai et posterai un exemple.la source