RoR: 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 ответа

Решение

Легко:

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

То же самое работает и с CSV.read.

У меня нет кода передо мной, но я верю row.to_hash делает это (где row это FasterCSV::Row текущей записи)

row.headers должен дать вам массив заголовков, кстати. Проверьте документы для получения дополнительной информации: http://fastercsv.rubyforge.org/classes/FasterCSV/Row.html

Я бы использовал foreach и относился к nils с уважением - иначе я бы рискнул ошибкой "undefined nil.+ Method"...

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

Хум бы:

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

делать?

[1..- 1] потому что нам не нужна строка заголовка с именами столбцов

затем, для каждой строки, получить первое слово, положить 0 в накопителе, если он не существует, увеличить его, вернуть

Другие вопросы по тегам