Comment créer une copie de certaines colonnes d'un fichier CSV dans Ruby avec différentes données dans une colonne?


84

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.

  1. Comment créer un nouveau fichier CSV?
  2. Comment copier les données des colonnes requises de A.csv vers "B.csv"?
  3. 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.


2
Il manque des informations de base, comme nous montrer vos efforts pour résoudre le problème. Ces informations se trouvent dans la documentation CSV. Lisez « Comment demander » et « exemple minimal reproductible ».
the Tin Man

Possible duplication du tableau
phunehehe

Réponses:


191

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


Et si je veux ouvrir sans écrire tout de suite? N'utilisez pas le bloc?
Donato

merci pour le code copiable et collant! - trop paresseux pour l'écrire.
DominikAngerer

Cela couvre la création d'un nouveau CSV, mais entre ensuite dans les informations sur l'ajout et la lecture de lignes entières plutôt que sur la demande de copie d'un sous-ensemble des coumns disponibles et de modifier ou d'ajouter à leurs valeurs. J'ai le même type de projet que l'OP et je n'ai pas été aidé par la documentation ou cette réponse, alors j'espère pouvoir revenir ici pour fournir une réponse plus précise une fois que je l'aurai compris.
Tyler James Young


0

Vous voudrez probablement l'utiliser CSV::parsepour 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 documentationCSV::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::Tableobjet en utilisant:

table = CSV.parse(File.read("cats.csv"), headers: true)

Maintenant, il y a de la documentation sur la CSV::Tableclasse , 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 .parsed'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_colméthode disponible pour votre nouvel Tableobjet. 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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.