我正在尝试打开一个CSV文件,查找一个字符串,然后返回csv文件的第二列,但只返回它的第一个实例。我已经达到了以下目的,但不幸的是,它返回了每个实例。我有点沮丧。
Ruby的众神可以帮忙吗?非常感谢。
中号
出于本示例的目的,假设names.csv是一个包含以下内容的文件:
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
好的,所以,如果我想返回foo的所有实例,但是在csv中,那么它是如何工作的? 所以我想要的结果是快乐,悲伤,饥饿,糟糕。我以为会是:
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
但它似乎无法正常工作
答案 0 :(得分:1)
FasterCSV.open('newfile.csv', 'w') do |output|
output << FasterCSV.open('names.csv').find { |r| r.index('foo') }[2]
end
index
调用如果找不到任何内容,将返回nil
;这意味着find
将为您提供具有'foo'
的第一行,您可以从结果中提取索引2处的列。
如果您不确定names.csv
是否会有您想要的内容,那么建议您进行一些错误检查:
FasterCSV.open('newfile.csv', 'w') do |output|
foos_row = FasterCSV.open('names.csv').find { |r| r.index('foo') }
if(foos_row)
output << foos_row[2]
else
# complain or something
end
end
或者,如果你想默默地忽略'foo'
的缺失并改为使用空字符串,你可以这样做:
FasterCSV.open('newfile.csv', 'w') do |output|
output << (FasterCSV.open('names.csv').find { |r| r.index('foo') } || ['','',''])[2]
end
我可能会选择“抱怨如果找不到”版本。