Я проанализировал CSV с помощью CSV.parse
и перемещаюсь по нему строка за строкой.Итак, объект, на который мы смотрим, это CSV::Row
, называемый row
. Это скриншот того, что происходит, когда я пытаюсь перемещаться row
: снимок экрана
Как видите, я могу позвонить .headers()
и, как и следовало ожидать, Strain
находится в списке
Когда вы смотрите на сам объект, вы видите "Strain":"818 Headband"
Так что row['Strain']
должно равняться 8181 Headband
, за исключением того, что оно возвращает nil
Естественно, я пытался row.Strain
, row["Strain"]
, row[Strain]
, row[:Strain]
, ни один из которых не работал.
Я также подумал, что он может содержаться в массиве с одним входом, поэтому я попытался row[0]['Strain']
, и это также не удивительно.
Предполагая, что проблема была с объектом CSV::Row
, я вызвалrow_hash = row.to_hash()
чтобы получить объект как хеш.
теперь, когда мы находимся в базовом ruby, конечно, нормальные вызовы, такие как row_hash['Strain']
, будут работать правильно?!?Нету.все еще nil
. представление row_hash
Я так озадачен, это совсем не сложный код.Документы для Hash
и CSV::Row
содержат список []
как метод и все статьи, которые я нашел в Google row['key']
как правильный формат ... за исключением того, что он не работает для меня.
Пожалуйста, помогите, у меня есть серия этих csvs, с которыми мне нужно заполнить базу данных, и я не могу этого сделать, если не могу перемещаться по хешу !!
Редактировать 12:51:00 15/15/18:
csv.each do |row|
row.each do |key, value|
binding.pry
end
end
$ key
=> "Strain"
$ value
=> "818 Headband"
$ row["Strain"]
=> nil
Это не может быть правдой ...
Редактировать 13:05 17.05.15:
$ = irb(main)
$ csv_text = File.read('strain_data_formatted.csv')
=> ... (it dumped the whole csv to console)
$ csv = CSV.parse(csv_text, :headers => true, :encoding => 'ISO-8859-1')
=> #<CSV::Table mode:col_or_row row_count:118>
$ csv.first
=> #<CSV::Row "Strain":"818 Headband" "Subspecies":nil "Heritage":nil...
$ csv.first["Strain"]
=> nil
$ csv.headers.first
=> "Strain"
$ csv.first[csv.headers.first]
=> "818 Headband"
$ csv.headers.first.class
=> String
$ "Strain".class
=> String
$ csv.headers.first == "Strain"
=> false
$ csv.headers.first
=> "Strain"
Как csv.headers.first
является строкой со значением "Штамм", но не соответствует строке со значением "Штамм"?!?