86 votes

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

J'ai un fichier CSV appelé "A.csv". Je dois 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 je devrai mettre à jour les valeurs d'une colonne en fonction des nouvelles valeurs de "B.csv". Enfin, j'utiliserai ces données de B.csv pour les 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 à une colonne particulière ?

Je suis novice en Ruby, mais je suis capable de lire un fichier CSV pour obtenir un tableau ou un hachage.

193voto

newUserNameHere Points 598

Comme l'a souligné Mikeb, il y a les documents - http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html - Vous pouvez également suivre les exemples ci-dessous (tous ont été testés et fonctionnent) :

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, un CSV très simple :

require "csv"
CSV.open("file.csv", "wb") do |csv|
  csv << ["animal", "count", "price"]
  csv << ["fox", "1", "$90.00"]
end

Le résultat est un fichier appelé "file.csv" avec les données suivantes :

animal,count,price
fox,1,$90.00

Comment ajouter des données à un fichier CSV

Presque la même formule que ci-dessus, mais au lieu d'utiliser le mode "wb", nous utiliserons le mode "a+". Pour plus d'informations à ce sujet, voir cette réponse de stack overflow : Quels sont les modes et options de 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

Lecture de notre fichier CSV

Vous savez maintenant comment copier et écrire dans un fichier, lire un CSV et donc récupérer les données pour la 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, il s'agit là d'une des centaines de façons différentes d'extraire des informations d'un fichier CSV à l'aide de ce programme. Pour plus d'informations, je vous suggère de visiter la documentation maintenant que vous avez un aperçu : http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html

4voto

MikeB Points 2167

Avez-vous vu la classe CSV de Ruby ? Elle semble assez complète. Jetez-y un coup d'œil ici : http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html

0voto

Tyler James Young Points 113

Vous voudrez probablement utiliser CSV::parse pour aider Ruby à comprendre votre CSV comme le tableau de données qu'il est et permettre un accès facile aux valeurs par en-tête.

Malheureusement, les données disponibles sur les de la documentation sur le CSV::parse méthode n'indique pas 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 pointent vers elle depuis ici.

Je recommande de lire cette page dans son intégralité. La partie cruciale concerne la transformation d'un fichier CSV donné en un fichier CSV::Table à l'aide d'un objet :

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

Aujourd'hui, il y a de la documentation sur le CSV::Table classe mais encore une fois, les exemples clairs de la page rubyguides.com vous aideront peut-être davantage. Une chose que je soulignerai est que lorsque vous dites à .parse pour 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 disponible pour votre nouvelle Table 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 j'y parviens, je reviendrai et posterai un exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X