Почему вы не можете использовать точечную запись при доступе к информации из объекта строки CSV?
Я пытаюсь перебрать файл CSV и распечатать информацию из строк. У меня есть две колонки с заголовками "описание" и "статус". Если я перебираю файл CSV, я получаю серию <CSV::Row "description":<description> "status":<status>
объекты. Я могу получить доступ к информации с помощью csv_row["description"]
, но нет csv_row.description
, Так как Ruby создает объекты из информации в каждой строке, почему он не доступен с точечной нотацией?
Образец кода:
CSV.foreach(@file.path, headers:true) do |task|
check_box = task["status"] == 0 ? "[ ] " : "[X] "
puts check_box + task["description"]
end
1 ответ
CSV
не работает таким образом, но вы могли бы использовать OpenStruct
:
require 'ostruct'
CSV.foreach(@file.path, headers: true) do |row|
task = OpenStruct.new(row.to_hash)
check_box = task.status == '0' ? '[ ]' : '[X]'
puts "#{check_box} #{task.description}"
end
Или просто создайте собственный класс, который соответствует вашим потребностям, например, через Struct
:
Task = Struct.new(:status, :description) do
def checkbox
status == 0 ? '[ ]' : '[X]'
end
def to_s
"#{checkbox} #{description}"
end
end
CSV_OPTIONS = { headers: true, header_converters: :symbol, converters: :numeric }
CSV.foreach(@file.path, CSV_OPTIONS) do |row|
task = Task.new(row[:status], row[:description])
puts task
end