2

我真的很难掌握如何有效地使用 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

4 回答 4

5

简单的:

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

CSV.read 也一样。

于 2008-12-04T00:34:30.403 回答
0

我面前没有代码,但我相信有(当前记录的在row.to_hash哪里)rowFasterCSV::Row

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

于 2008-12-03T23:35:06.450 回答
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
于 2009-09-30T11:10:30.270 回答
-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 放入累加器中,将其递增,返回

于 2008-12-03T23:35:44.593 回答