Добро пожаловать в переполнение стека. Когда вы в следующий раз напишите пост, вы можете использовать инструменты форматирования кода, чтобы его было легче читать.
Я вижу несколько ошибок здесь.
- Согласно комментарию Марка,
count.v
должно быть v.count
.
- Вы объединили два оператора в одной строке без разделителя, поэтому я предполагаю, что ваше сообщение об ошибке похоже на
unexpected tIDENTIFIER, expecting end-of-input
. Вы хотите связать их вместе, чтобы при выполнении вашего условия аргументы добавлялись в CSV.
- Вертикальные каналы
|k, v|
используются для обозначения аргументов блока в ruby, но вы повторяете их, когда вам, вероятно, нужен массив.
- Я действительно не вижу, что
.to_a.each.count
делает для вас, за исключением, возможно, появления дополнительных синтаксических ошибок.
Чтобы написать это в одной строке:
CSV.open("final_data.csv", "wb") {|csv| @boo_hoo.each {|k, v| csv << [k, v] if v.count > 1 } }
Это может быть немного длинно, поэтому я хотел бы разбить блок на многострочный блок:
CSV.open("final_data.csv", "wb") do |csv|
@boo_hoo.each {|k, v| csv << [k, v] if v.count > 1 }
end
РЕДАКТИРОВАТЬ: Вы редактировали свой пост, как я написал это. В ruby идиома - использовать одиночные скобки {}
для блока, состоящего из одной строки кода, но do ... end
для блока, растянутого на несколько строк.
Также, в ответ на комментарий Мудасобвы, вы, вероятно, захотите добавить оператор сплат [k,*v]
. Мой код является допустимым ruby, но вывод, вероятно, не то, что вы хотите. Допустим, @boo_hoo = {:a=>[1, 2, 3], :b=>[1], :c=>[1, 2]}
. Код выше производит вывод
a,"[1, 2, 3]"
c,"[1, 2]"
Если вы измените блок на
@boo_hoo.each {|k, v| csv << [k, *v] if v.count > 1 }
вы получите вывод
a,1,2,3
c,1,2
Это почти наверняка то, что вы действительно хотите в CSV.