RoR: FasterCSV для хэширования - PullRequest
       12

RoR: FasterCSV для хэширования

2 голосов
/ 04 декабря 2008

Я действительно пытаюсь понять, как эффективно использовать FasterCSV для достижения того, чего я хочу.

У меня есть файл CSV; говорят:

ID,day,site
test,tuesday,cnn.com
bozo,friday,fark.com
god,monday,xkcd.com
test,saturday,whatever.com

I, что пройти через этот файл и получить хеш, в котором есть счетчик количества повторений первого столбца. Итак:

["test" => 2, "bozo" => 1, "god" => 1]

Мне нужно быть в состоянии сделать это без предварительного знания значений в первом столбце.

Ответы [ 4 ]

5 голосов
/ 04 декабря 2008

Легко:

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

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

0 голосов
/ 30 сентября 2009

Я бы использовал 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
0 голосов
/ 04 декабря 2008

гул, будет:

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

до?

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

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

0 голосов
/ 04 декабря 2008

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

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

...