RoR:FasterCSV哈希

时间:2008-12-03 23:16:50

标签: ruby-on-rails ruby hash csv fastercsv

我正在努力抓住如何有效地使用FasterCSV来实现我想要的目标。

我有一个CSV文件;说:

ID,day,site
test,tuesday,cnn.com
bozo,friday,fark.com
god,monday,xkcd.com
test,saturday,whatever.com

我要通过这个文件,最后得到一个哈希,它有一个计数器显示第一列的次数。所以:

["test" => 2, "bozo" => 1, "god" => 1]

我需要能够在不事先了解第一列中的值的情况下执行此操作。

4 个答案:

答案 0 :(得分:5)

易:

h = Hash.new(0)
FasterCSV.read("file.csv")[1..-1].each {|row| h[row[0]] += 1}

同样适用于CSV.read。

答案 1 :(得分:0)

我没有在我面前的代码,但我相信row.to_hash会这样做(row是当前记录的FasterCSV::Row

顺便提一下,

row.headers会给你一个标题数组。查看文档了解更多信息:http://fastercsv.rubyforge.org/classes/FasterCSV/Row.html

答案 2 :(得分:0)

我会使用foreach,并尊重nils - 否则我会冒“未定义的nil。+方法”错误......

counter = {}
FasterCSV.foreach("path_to_your_csv_file", :headers => :first_row) do |row|
  key=row[0]
  counter[key] = counter[key].nil? ? 1 : counter[key] + 1
end

答案 3 :(得分:-2)

哼,会:

File.open("file.csv").readlines[1..-1].inject({}) {|acc,line| word = line.split(/,/).first; acc[word] ||= 0; acc[word] += 1; acc}

做什么?

[1 ..- 1]因为我们不希望标题行带有列名

然后,对于每一行,获取第一个单词,如果它不存在则将0放在累加器中,递增它,返回