-1

我正在尝试遍历 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
4

1 回答 1

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
于 2018-08-27T09:11:59.640 回答