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 を使用し、nil を尊重して扱います。そうしないと、「未定義の 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 に答える