2011-05-11 8 views
4

J'ai essayé de travailler avec une seule colonne d'un fichier csv.Utilisation de Ruby CSV pour extraire une colonne

J'ai parcouru la documentation, http://www.ruby-doc.org/stdlib/libdoc/csv/rdoc/index.html mais je ne comprends toujours pas comment l'utiliser. Si j'utilise CSV.table, la réponse est incroyablement lente par rapport à CSV.read. J'avoue que l'ensemble de données que je charge est assez volumineux, ce qui est exactement la raison pour laquelle je veux seulement en obtenir une seule colonne.

Ma demande est tout simplement ressemble actuellement à ce

@dataTable = CSV.table('path_to_csv.csv') 

et quand je debug je reçois une réponse de

 
#<CSV::Table mode:col_or_row row_count:2104 > 

La documentation dit que je devrais être en mesure d'utiliser by_col(), mais lorsque je tente pour sortir

<%= debug @dataTable.by_col('col_name or index') %> 

Il me donne "méthode non définie 'col' erreur "

Quelqu'un peut-il m'expliquer comment je suis censé utiliser CSV? et s'il y a un moyen d'obtenir des colonnes plus rapidement en utilisant 'read' au lieu de 'table'? J'utilise Ruby 1.92, qui dit qu'il utilise le fastCSV, donc je n'ai pas besoin d'utiliser la gemme FasterCSV.

+0

Vous pourriez vous tromper car by_col ne prend aucun argument. – Gal

Répondre

11

Pour arracher une colonne d'un csv je ferais probablement quelque chose comme ce qui suit:

col_data = [] 
CSV.foreach(FILENAME) {|row| col_data << row[COL_INDEX]} 

Cela devrait être beaucoup plus rapide que toutes les opérations sur CSV.Table

+0

merci, c'est un peu plus rapide que d'utiliser la table. – pedalpete

4

Vous pouvez obtenir les valeurs à partir d'une seule colonne des fichiers CSV à l'aide de l'extrait suivant.

@dataTable = CSV.table('path_to_csv.csv') 
@dataTable[:columnname] 
+0

c'est la meilleure réponse – sixty4bit

Questions connexes