首页 > 解决方案 > 如何有效输入以匹配 CSV 文件中的数据

问题描述

我正在使用上面的 Ruby 2.7。我一直在做这个任务并且还在学习。我很确定我没有使用正确的代码。这个任务需要我做一个模拟atm程序。要求之一是我需要检查用户的有效输入是否与 CSV.file 中的数据匹配,然后用户才能访问该程序。

我正在使用 ruby​​(不允许使用 rails 或任何高级 ruby​​ 代码)。我在任何地方搜索了类似的程序以供参考,但大多不涉及 CSV 文件。如何检查来自用户的输入是否有效并在 CSV 文件中匹配?我在如何进行验证以及如何使用两个输入(用户名和密码)进行验证时遇到了麻烦。该程序在命令行上运行。如果我不够清楚,请道歉。你能从我的代码中告诉我哪里出错了吗?

我有三个 .rb 文件和两个 csv 文件。我不确定是否应该创建两个单独的 csv 文件。

下面是function.rb文件。

require 'csv'

class Function   

  def log_in(user)
    CSV.foreach('user.csv', 'r', headers => true) do |row|
     #check the user is valid, else error
      if row[0] == uname && row[1] == pwd
        puts "succesfully login"
        ATMSystem.main_menu  
      end
    end

    if login == false
      puts "invalid credentials."
      Login.log_menu
    end   
 end

login.rb文件

require './function'

class Inn

  def signin
    function = AtmFunction.new

    puts "Account login"
    puts "Enter username"
    uname = gets.chomp
    puts "Enter password"
    pwd = gets.chomp
    user = [uname, pwd]

    function.log_in(user)
  end
end

标签: rubycsvvalidationuser-inputverify

解决方案


假设这是您的users.csv文件:

name,password
bob,1234
alice,5678

这是一种可能的选择。

将文件加载到哈希数组Enumerable#to_hHash#transform_keys中:

require 'csv'

data_file = 'user.csv'
user_map = CSV.foreach(data_file, headers: true).map do |row|
  row.to_h.transform_keys(&:to_sym)
end

user_map
#=> [{:name=>"bob", :password=>"1234"}, {:name=>"alice", :password=>"5678"}]

然后,给定用户的输入:

input_username = 'bob'
input_password = '1234'

检查用户是否存在并比较密码:

user = user_map.find { |h| h[:name] == input_username }
#=> {:name=>"bob", :password=>"1234"}
user[:password] == input_password
#=> true

如果Enumerable#find返回非值,请检查密码nil:用户不存在:

input_username = 'ron'
user = user_map.find { |h| h[:name] == input_username }
user
#=> nil

在您的实施之后,您还可以编写:

login_passed = false
CSV.foreach(data_file, headers: true) do |row|
  login_passed = row['name'] == input_username && row['password'] == input_password
  break if login_passed
end

login_passed
#=> true (or false)

推荐阅读