From: James Gray Date: 2008-11-20T22:57:14+09:00 Subject: Re: How to use fastercsv to get rows as hashes? On Nov 20, 2008, at 6:38 AM, sa 125 wrote: > Hi - I'm fairly new to ruby Hello and welcome. > and trying to read a csv file using the fastercsv gem. I managed to > read the rows arrays of data using: > > require 'fastercsv' > > def read_csv > path_to_file = "/home/work/some_file.csv" > > # open the csv file to read > csv = FasterCSV.open(path_to_file, "r") > > # do stuff on rows as arrays > while row = csv.readline > #... row will be ["cell1", "cell2", "cell3", ...] > end > end Looking good. You can simplify it a bit if you like though: def read_csv(path = "/home/work/some_file.csv") FCSV.foreach(path) do |row| # ... end end foreach() is just a shortcut for open() and each(), which works like your while loop. > What I'm trying to understand is how do I get the row as a hash where > the keys are the column headers (so I don't have to remember where > each > column sits in the array): > > #...inside loop > col1 = row['some column'] > col2 = row['another column'] > #... The first step is to tell FasterCSV that the file has headers. You can do that by changing this line: FCSV.foreach(path) do |row| to this: FCSV.foreach(path, :headers => true) do |row| When you make that change, row will become a FasterCSV::Row object, instead of a normal Array. It has many features and will allow you to access columns by name exactly as you show above. If you really do want a Hash though, you can get it with a simple method call: row_hash = row.to_hash Hope that helps. James Edward Gray II