【问题标题】:Ruby - How do I write the values into csv file? [closed]Ruby - 如何将值写入 csv 文件? [关闭]
【发布时间】:2021-02-12 12:04:26
【问题描述】:

谁能帮我了解如何从问题“puts”中获取姓名、位置、菜肴和时间的值并将其保存到logs.csv文件中?

这是以下描述:

  1. 以某种方式检索用户的午餐信息(即用户是谁、他们在什么地点吃的、吃了多少道菜以及在什么时间吃的)
  2. 将该信息保存到数据库文件中
  3. 检索该信息,下面是我的代码...
class Lunch

  def initialize(name, location, dishes, time)
  
  end
  
     def save_to_csv(csv)
    CSV.open("C:/ruby/logs.csv", "w") do |row|
      row << %w[name location dishes time]
      all.each { |user| csv << user }
    end
  end
  
  def self.read_from_csv(csv)
     CSV.foreach("C:/ruby/logs.csv") do |row|
     puts row ['name', 'location', 'dishes', 'time']
   end
 end
     
  def names
    puts 'Register your name here?'
    name = gets.chomp
    name = 'Guest' if name.empty?
    puts "Hello #{name}"
  end

  def logs
    puts "Hello, "
    puts 'Where did you had your lunch?'
    location = gets.chomp
    location = 'unknown location' if location.empty?

    puts 'What did you eat?'
    dishes = gets.chomp
    dishes = 'unknown dishes' if dishes.empty?

    puts "I ate #{dishes} at #{location}"\
    " at "

    now = DateTime.now
    puts now

  end

  def displays
    puts "Display logs? (y/n?)"
    display = gets.chomp
    display.load('lunchlogs.csv') if display == "y"
    puts "no logs to display" if display != "n"
  end
  end

我对这些部件有疑问。我无法写入甚至读取 logs.csv 中的内容

我尝试了各种选择。有小费吗?谢谢。

  def save_to_csv(csv)
    CSV.open("C:/ruby/logs.csv", "w") do |row|
      row << %w[name location dishes time]
      all.each { |user| csv << user }
    end
  end
  
  def self.read_from_csv(csv)
     CSV.foreach("C:/ruby/logs.csv") do |row|
     puts row ['name', 'location', 'dishes', 'time']
   end
 end
        

【问题讨论】:

  • 为什么你的do块没有end
  • save_to_csv 中的all 是什么?
  • @Spikie 好的,所以我改变了它,但是当我运行它时出现 NameError &lt;class:UserLunch&gt;': undefined local variable or method names' for UserLunch:Class (NameError)` 我是 ruby​​ 新手

标签: ruby logging console write


【解决方案1】:

我修改了你的部分代码,使其可读性和简洁性。最终代码如下:

require 'csv'

class LunchLog
  attr_accessor :name, :location, :dishes, :time

  def initialize(name, dishes, location, time)
    @name = name
    @dishes = dishes
    @location = location
    @time = time
  end

  def save_to_csv
    CSV.open('logs.csv', 'a+') do |row|
      row << attrs
    end
  end

  def self.read_from_csv
    CSV.foreach('logs.csv') do |row|
      puts new(*row).to_s
    end
  end

  def to_s
    "#{name} ate #{dishes} at #{location} at #{time}"
  end

  def attrs
    [name, dishes, location, time]
  end
end

class Console
  class << self
    def init_menu
      menu = "Welcome to pandan lunch log. choose menu:\n1. Add new lunch log\n2. List log"

      case get_input(menu, %w[1 2])
      when '1'
        record
      when '2'
        display
      end
    end

    def record
      location = get_input('Where did you had your lunch?')
      dishes = get_input('What did you eat?')
      name = get_input('Register your name here?')

      l = LunchLog.new(name, dishes, location, Time.now)
      l.save_to_csv
      puts l.to_s
    end

    def display
      i = get_input('Display logs? (y/n?)', %w[y n])
      if i == 'y'
        LunchLog.read_from_csv
      else
        puts 'no logs to display'
      end
    end

    def get_input(prompt, valid_attrs = nil)
      loop do
        puts prompt
        input = gets.chomp
        if (valid_attrs && !valid_attrs.include?(input)) || input.empty?
          s = valid_attrs.nil? ? 'Invalid value' : "Invalid value, please input #{valid_attrs}"
          puts s
          next
        end

        return input
      end
    end
  end
end

Console.init_menu

为什么您的代码不起作用:

  • 您没有加载 csv。如果要使用CSV 模块,请先使用require csv
  • 您的代码末尾有太多未例外的end

您的代码可以改进的地方

无论代码用于什么功能,都应该易于理解和优雅。

为了编写可读的代码,我们应该分离每个类的功能和职责。在您的代码中,UserLunch 类的职责并不单一,它不仅记录午餐日志,还负责命令行交互功能。这很混乱。

为了编写优雅的代码,永远不要重复自己。您的代码中有很多类似的语句来获取用户输入。这可以抽象成一个方法以供重用。

【讨论】:

  • 目前我的代码还不够好,希望有人给我建议。谢谢!
  • 感谢您的快速响应、帮助和建议! :) 但是自从我上周刚开始学习以来,我仍然难以理解 ruby​​ 代码。
  • 第一次学习ruby代码时也是这样。如果您对我的代码有任何疑问,请告诉我
  • 你介意解释一下这部分'class Console class
猜你喜欢
  • 2016-09-05
  • 1970-01-01
  • 2013-03-13
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2019-07-24
相关资源
最近更新 更多