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_sepconverters: [:integer]
  • ブロック内ではrow、配列のようにアクセスできます。つまりrow[0]、最初のフィールド、row[1]2 番目のフィールドなどです。
  • 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 に答える