CSV :: Row и Hash навигация не работает Ruby 2.3.3 Rails 5.1 - PullRequest
0 голосов
/ 14 мая 2018

Я проанализировал 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 является строкой со значением "Штамм", но не соответствует строке со значением "Штамм"?!?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Вы можете использовать метод gsub для удаления лишних невидимых символов

gsub("\xEF\xBB\xBF","")
0 голосов
/ 14 мая 2018

Простая Лайм указала мне правильный путь! Спасибо!

Проблема в том, что существуют скрытые символы, которые не отображаются при выводе заголовка в виде строки. Вот почему csv.first[csv.headers.first] работает, а csv.first["Strain"] - нет, хотя csv.headers.first возвращает "Strain". Предположительно, что он действительно возвращает, это что-то вроде "invisiblestuffStrain" (преувеличено, но вы поняли).

Чтобы проверить, действительно ли это так, вызовите метод .bytes в заголовке, а затем снова вызовите .bytes для ожидаемого строкового значения, например "Strain".bytes. Если есть какая-то разница, у вас есть скрытые персонажи.

Вот мой фактический вывод на консоль:

$ csv.headers.first.bytes
=> [239, 187, 191, 83, 116, 114, 97, 105, 110]
$ "Strain".bytes
=> [83, 116, 114, 97, 105, 110]

Вы можете видеть 3 дополнительных символа, хранящихся для этого объекта, которые не отображаются, когда он отображается в виде строки.

Simple Lime говорит: «вам нужно gsub их удалить или удалить текст в исходном csv и перепечатать его вручную, чтобы не было добавлено ничего лишнего» * ​​1021 *

Для меня мне пришлось изменить .csv непосредственно из моего текстового редактора, в котором он использовал Excel и сохранить его как .csv.

Редактировать: Я обнаружил, что сохранение из рабочей книги .xlsx в MS Excel в .csv - вот что вызывало появление этих странных символов. Мне пришлось отредактировать файл, чтобы я снова открыл и снова сохранил, и снова получил ту же ошибку, когда я снова посеял. Как и прежде, повторный ввод этого первого заголовка из текстового редактора устранил проблему.

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