2011-08-23 45 views
0

我試圖打開一個CSV文件,查找一個字符串,然後返回csv文件的第二列,但只有第一個實例它。我已經得到了以下內容,但不幸的是,它返回每個實例。我有點失意。試圖找到CSV中使用fastercsv的字符串的第一個實例

紅寶石的神可以幫助嗎?非常感謝。

中號

這個例子的目的,讓我們說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 

OK,所以,如果我想返回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 

,但它似乎沒有工作

+0

你有沒有考慮過使用'grep'和'cut'?例如'grep'foo'| cut -d,-f2' – buruzaemon

+0

'foo'是否改變或者是靜態的?,你可以粘貼names.csv –

+0

的示例代碼片段嗎?是的,已經考慮過grep + cut,但它是更大程序的一部分。另外,foo將被一個變量變量替換,但爲了達到這個目的,我們可以假定它只是字符串foo。 (謝謝) – MarkL

回答

1

open更換foreach(以獲得可枚舉),並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 

我可能會跟去「告狀如果未找到」版本雖然。

+0

嗯,真的很有趣,解釋真的很有幫助。如果我想要退回第一例以外的東西,該怎麼辦?我的理解是.index只返回第一個實例,所以如果我想要第二/第三/任何實例,它會在哪裏改變?再次感謝。 – MarkL

+0

@MarkL:'index'只是用來查看該行是否有'foo'',你可以使用任何適合的測試。如果你想要所有匹配的行,那麼就有'find_all'。 –

+0

ok,所以.index返回foo的一個實例,而find_all返回foo的所有實例?我曾想過.index再次返回foo的第一個實例(因此混淆)。 – MarkL

相關問題