我正在努力抓住如何有效地使用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]
我需要能够在不事先了解第一列中的值的情况下执行此操作。
答案 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放在累加器中,递增它,返回