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 в накопителе, если он не существует, увеличить его, вернуть