0

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

但它似乎不起作用

4

1 回答 1

1

替换foreachopen(以获取 Enumerable)和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

不过,我可能会选择“如果找不到就投诉”版本。

于 2011-08-23T05:43:16.143 回答