I’m trying to open a CSV file, look up a string, and then return the 2nd column of the csv file, but only the the first instance of it. I’ve gotten as far as the following, but unfortunately, it returns every instance. I’m a bit flummoxed.
Can the gods of Ruby help? Thanks much in advance.
M
for the purpose of this example, let’s say names.csv is a file with the following:
foo, happy
foo, sad
bar, tired
foo, hungry
foo, bad
#!/usr/local/bin/ruby -w
require 'rubygems'
require 'fastercsv'
require 'pp'
FasterCSV.open('newfile.csv', 'w') do |output|
FasterCSV.foreach('names.csv') do |lookup|
index_PL = lookup.index('foo')
if index_PL
output << lookup[2]
end
end
end
ok, so, if I want to return all instances of foo, but in a csv, then how does that work?
so what I’d like as an outcome is happy, sad, hungry, bad. I thought it would be:
FasterCSV.open('newfile.csv', 'w') do |output|
FasterCSV.foreach('names.csv') do |lookup|
index_PL = lookup.index('foo')
if index_PL
build_str << "," << lookup[2]
end
output << build_str
end
end
but it does not seem to work
Replace
foreachwithopen(to get an Enumerable) andfind:The
indexcall will returnnilif it doesn’t find anything; that means that thefindwill give you the first row that has'foo'and you can pull out the column at index 2 from the result.If you’re not certain that
names.csvwill have what you’re looking for then a bit of error checking would be advisable:Or, if you want to silently ignore the lack of
'foo'and use an empty string instead, you could do something like this:I’d probably go with the “complain if it isn’t found” version though.