0

CSV ファイルを開き、文字列を検索してから、csv ファイルの 2 列目を返そうとしていますが、最初のインスタンスのみが返されます。私は次のようになりましたが、残念ながらすべてのインスタンスを返します。私は少し困惑しています。

ルビーの神々は助けてくれるでしょうか?よろしくお願いします。

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 のすべてのインスタンスを 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

(Enumerable を取得するため) および にforeach置き換えます。openfind

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 に答える