пытаясь найти 1-й экземпляр строки в CSV, используя quickcsv - PullRequest
0 голосов
/ 23 августа 2011

Я пытаюсь открыть файл CSV, найти строку, а затем вернуть 2-й столбец файла 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, но в 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 Ответ

1 голос
/ 23 августа 2011

Замените foreach на open (чтобы получить 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

Я бы, наверное, пошел с версией "пожаловаться, если она не найдена".

...