0

我正在尝试从 CSV 文件中选择最好的 3 个结果。读取文件没问题,但我无法从我的文件中挑选出最好的结果。

到目前为止,这是我从文件中挑选出最好的 3 个结果:

CSV 文件:

Brain 345677
Mary 5
John 23355676
William 432200
Jessica 21

红宝石代码:

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
4

2 回答 2

3

欢迎使用 Stack Overflow,欢迎使用 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 个条目
于 2013-08-29T12:46:36.500 回答
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]
于 2013-08-29T13:03:29.853 回答