尝试使用fastercsv在CSV中查找字符串的第一个实例

时间:2011-08-23 04:42:29

标签: ruby csv fastercsv

我正在尝试打开一个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

但它似乎无法正常工作

1 个答案:

答案 0 :(得分:1)

foreach替换为open(以获得可枚举)和find

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

我可能会选择“抱怨如果找不到”版本。