60

私はcsvファイル、いくつかのホッケー統計を持っています、例えば:

09.09.2008,1,HC Vitkovice Steel,BK Mlada Boleslav,1:0 (PP)
09.09.2008,1,HC Lasselsberger Plzen,RI OKNA ZLIN,6:2
09.09.2008,1,HC Litvinov,HC Sparta Praha,3:5

それらをハッシュの配列に保存したいと思います。ヘッダーがないので、各値にキーを追加したいと思います"time" => "09.09.2008"。各行は、のようにアクセス可能である必要があります。arr[i]たとえば、各値はarr[i]["time"]。またはCSVよりもクラスの方が好きです。同様の問題が解決された方法を示したり、スレッドにリダイレクトしたりできますか?FasterCSVsplit

4

7 に答える 7

88

合格するだけheaders: true

CSV.foreach(data_file, headers: true) do |row|
  puts row.inspect # hash
end

そこから、好きなようにハッシュを操作できます。

(Ruby 2.0でテストしましたが、これはかなり長い間機能していると思います。)

編集

ヘッダーがないと言いますが、ファイルの内容を読んだ後、ファイルの内容の先頭にヘッダー行を追加できますか?

于 2014-03-28T19:36:58.260 に答える
42

Ruby CSVパーサーを使用して解析し、を使用Hash[ keys.zip(values) ]してハッシュにすることができます。

例:

test = '''
09.09.2008,1,HC Vitkovice Steel,BK Mlada Boleslav,1:0 (PP)
09.09.2008,1,HC Lasselsberger Plzen,RI OKNA ZLIN,6:2
09.09.2008,1,HC Litvinov,HC Sparta Praha,3:5
'''.strip

keys = ['time', etc... ]
CSV.parse(test).map {|a| Hash[ keys.zip(a) ] }
于 2013-01-07T16:26:34.743 に答える
38

これは、あなたが求めていることを行う方法を説明するJoshNicholsによる素晴らしい投稿です。

要約すると、ここに彼のコードがあります:

csv = CSV.new(body, :headers => true, :header_converters => :symbol, :converters => [:all, :blank_to_nil])
csv.to_a.map {|row| row.to_hash }
=> [{:year=>1997, :make=>"Ford", :model=>"E350", :description=>"ac, abs, moon", :price=>3000.0}, {:year=>1999, :make=>"Chevy", :model=>"Venture \"Extended Edition\"", :description=>nil, :price=>4900.0}, {:year=>1999, :make=>"Chevy", :model=>"Venture \"Extended Edition, Very Large\"", :description=>nil, :price=>5000.0}, {:year=>1996, :make=>"Jeep", :model=>"Grand Cherokee", :description=>"MUST SELL!\nair, moon roof, loaded", :price=>4799.0}]

したがって、CSVファイルの本文を。という文字列に保存できますbody

body = "09.09.2008,1,HC Vitkovice Steel,BK Mlada Boleslav,1:0 (PP)
09.09.2008,1,HC Lasselsberger Plzen,RI OKNA ZLIN,6:2
09.09.2008,1,HC Litvinov,HC Sparta Praha,3:5"

次に、上記のコードを実行します。

于 2013-12-30T19:23:41.593 に答える
32

少し短い解決策

文字列の解析:

CSV.parse(content, headers: :first_row).map(&:to_h)

ファイルの解析:

CSV.open(filename, headers: :first_row).map(&:to_h)
于 2018-02-26T10:08:37.637 に答える
5

ネイサンロングの答えのわずかな変化

data_file = './sheet.csv'
data = []
CSV.foreach(data_file, headers: true) do |row|
  data << row.to_hash
end

dataこれで、入札を行うための一連のハッシュが作成されました。

于 2016-11-18T15:48:56.510 に答える
2

CSVモジュールのheadersオプションは、CSVコンテンツの最初の行として存在しない場合に、ヘッダーとして使用される文字列の配列を受け入れます。

CSV.parse(content, headers: %w(time number team_1 team_2 score))

これにより、指定されたヘッダーをキーとして使用して、列挙可能なハッシュが生成されます。

于 2018-04-24T15:39:04.330 に答える
1

次の宝石も試すことができます

require 'csv_hasher'
arr_of_hashes = CSVHasher.hashify('/path/to/csv/file')

返されるハッシュのキーは、csvファイルのヘッダー値になります。

自分の鍵を渡したい場合は、

keys = [:key1, :key2, ... ]
arr_of_hashers = CSVHasher.hashify('/path/to/csv/file', { keys: keys }) 
于 2015-05-25T22:45:46.303 に答える