Ruby 尝试使用fastercsv在CSV中查找字符串的第一个实例
我试图打开一个CSV文件,查找一个字符串,然后返回CSV文件的第二列,但只返回它的第一个实例。我已经做了如下工作,但不幸的是,它返回了每个实例。我有点不知所措 鲁比之神能帮忙吗?非常感谢 M 在本例中,假设names.csv是一个包含以下内容的文件:Ruby 尝试使用fastercsv在CSV中查找字符串的第一个实例,ruby,csv,fastercsv,Ruby,Csv,Fastercsv,我试图打开一个CSV文件,查找一个字符串,然后返回CSV文件的第二列,但只返回它的第一个实例。我已经做了如下工作,但不幸的是,它返回了每个实例。我有点不知所措 鲁比之神能帮忙吗?非常感谢 M 在本例中,假设names.csv是一个包含以下内容的文件: foo, happy foo, sad bar, tired foo, hungry foo, bad #!/usr/local/bin/ruby -w require 'rubygems' require 'fastercsv' requi
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,快乐
福,伤心
酒吧,累了
福,饿了
福,糟糕
#!/usr/local/bin/ruby-w
需要“rubygems”
需要'fastercsv'
需要“pp”
FasterCSV.open('newfile.csv','w')do |输出|
FasterCSV.foreach('names.csv')执行|查找|
index\u PL=lookup.index('foo')
如果索引为
输出将foreach
替换为(以获取可枚举数据),并:
或者,如果您想默默地忽略缺少'foo'
而使用空字符串,您可以执行以下操作:
FasterCSV.open('newfile.csv', 'w') do |output|
output << (FasterCSV.open('names.csv').find { |r| r.index('foo') } || ['','',''])[2]
end
FasterCSV.open('newfile.csv','w')do|输出|
您是否考虑过只使用grep
和cut
?e、 g.grep'foo'| cut-d,-f2
foo'是变化的还是静态的?,你能粘贴一个名称的示例片段吗。csvyes,考虑过grep+cut,但它是更大程序的一部分。此外,foo实际上会被一个变化的变量所取代,但出于这个目的,我们可以假定它只是字符串foo。(谢谢)嗯,真的很有趣,解释也很有帮助。如果我想返回除第一个实例之外的其他内容,该怎么办?我的理解是。index只返回第一个实例,所以如果我想要第二个/第三个/任何实例,它会在哪里更改?再次感谢。@MarkL:索引
仅用于查看行是否有'foo'
,您可以使用任何适当的测试。如果您想要所有匹配的行,那么有find\u all
。好的,那么。index返回一个foo实例,而find\u all返回所有foo实例?我原以为。index再次返回了foo(因此混淆)thx的第一个实例。@MarkL:No,index
查找您要查找的内容的索引,或者nil
(如果不存在)find
返回迭代器的第一个值,其中块返回真值。
FasterCSV.open('newfile.csv', 'w') do |output|
output << FasterCSV.open('names.csv').find { |r| r.index('foo') }[2]
end
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
FasterCSV.open('newfile.csv', 'w') do |output|
output << (FasterCSV.open('names.csv').find { |r| r.index('foo') } || ['','',''])[2]
end