2013-08-29 21 views
0

我試圖從CSV文件中選出最佳的3個結果。讀取文件沒有問題,但我無法從我的文件中選擇最佳結果。ruby​​讀取文件並選擇最佳結果

這是我迄今爲止接從文件中最好的3個結果:

CSV文件:

Brain 345677 
Mary 5 
John 23355676 
William 432200 
Jessica 21 

Ruby代碼:

elements = [] 

file = File.open'ballots.csv', 'r' do |file| 
    header = false 

    ballots = [] 
    results = [] 

    while line = file.gets 
    unless header 
     element = line.split ',' 

     if [:ballots1] > [:ballots2] 
     results = ballots1 
     end 
    else 
     results = ballots2 
    end 

    puts "#{element[3]}:#{element[4]}" 
    end 

    header = false 
end 

回答

1

請問這個例子幫助:

x = <<HERE 
Mary,5 
John,23355676 
William,432200 
Jessica,21 
HERE 

x.split("\n").sort{|a,b| a.split(',')[1].to_i <=> b.split(',')[1].to_i}[0..2] 

# => ["Mary 5", "Jessica 21", "William 432200"] 

如果要顛倒排序,然後將其更改爲這樣:

x.split("\n").sort{|a,b| b.split(',')[1].to_i <=> a.split(',')[1].to_i}[0..2] 
3

歡迎堆棧溢出並歡迎來到Ruby。你的代碼看起來非常複雜,實際上似乎不起作用。

使用Ruby的CSV類,我會做這樣的事情:

require 'csv' 

elements = {} 

CSV.foreach("ballots.csv", col_sep: " ", converters: [:integer]) do |row| 
    elements[row[0]] = row[1] 
end 

elements 
#=> {"Brain"=>345677, "Mary"=>5, "John"=>23355676, "William"=>432200, "Jessica"=>21} 

sorted = elements.sort_by { |name, ballots| ballots }.reverse 
#=> [["John", 23355676], ["William", 432200], ["Brain", 345677], ["Jessica", 21], ["Mary", 5]] 

top_3 = sorted.first(3) 
#=> [["John", 23355676], ["William", 432200], ["Brain", 345677]] 
  • elements = {}創建一個空的哈希值,我們的數據結構,用於存儲CSV數據
  • CSV.foreach("ballots.csv", col_sep: " ", converters: [:integer])讀取ballots.csv並執行塊(do ... end),使用空格(" ")作爲列分隔符(col_sep)並自動轉換整數(converters: [:integer]
  • 塊內,row可以像陣列進行訪問的,即row[0]是第一場,row[1]第二等
  • elements[row[0]] = row[1]創建一個新的鍵 - 值對與row[0](名稱)作爲密鑰和row[1](空格)作爲值
  • elements.sort_by { |name, ballots| ballots }的數目排序由空格(它轉換爲一個數組收集上升,但是這並不重要),.reverse逆轉它(使它降序)
  • sorted.first(3)最後返回頂部3條目
+0

應該有3最好的,不只是一個最大 –

+0

@YevgeniyAnfilofyev權,我已經爲'require'csv''更新了我的回答 – Stefan

+1

+1。好的代碼通常是懶惰的代碼,寧願讓別人去做這件事。 –

相關問題