Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 尝试使用fastercsv在CSV中查找字符串的第一个实例_Ruby_Csv_Fastercsv - Fatal编程技术网

Ruby 尝试使用fastercsv在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

我试图打开一个CSV文件,查找一个字符串,然后返回CSV文件的第二列,但只返回它的第一个实例。我已经做了如下工作,但不幸的是,它返回了每个实例。我有点不知所措

鲁比之神能帮忙吗?非常感谢

M

在本例中,假设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,快乐
福,伤心
酒吧,累了
福,饿了
福,糟糕
#!/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