Пишите в CSV из хэша в ruby - PullRequest
       1

Пишите в CSV из хэша в ruby

0 голосов
/ 14 сентября 2018

Я пытаюсь записать в CSV некоторые хэш-элементы. @boo_hoo мой хэш для каждого из его ключей, если у них есть одно значение, я не хочу их в CSV. Должно быть что-то не так с моим синтаксисом. Может кто-нибудь объяснить немного, как получить доступ к ключу + значениям хеша в этом случае? Спасибо!

CSV.open("final_data.csv", "wb") {|csv| 
    @boo_hoo.to_a.each.count {|k, v|
        count.v > 1 csv << |k, v|
    } 
}

1 Ответ

0 голосов
/ 14 сентября 2018

Добро пожаловать в переполнение стека. Когда вы в следующий раз напишите пост, вы можете использовать инструменты форматирования кода, чтобы его было легче читать.

Я вижу несколько ошибок здесь.

  1. Согласно комментарию Марка, count.v должно быть v.count.
  2. Вы объединили два оператора в одной строке без разделителя, поэтому я предполагаю, что ваше сообщение об ошибке похоже на unexpected tIDENTIFIER, expecting end-of-input. Вы хотите связать их вместе, чтобы при выполнении вашего условия аргументы добавлялись в CSV.
  3. Вертикальные каналы |k, v| используются для обозначения аргументов блока в ruby, но вы повторяете их, когда вам, вероятно, нужен массив.
  4. Я действительно не вижу, что .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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...