如何有效输入以匹配 CSV 文件中的数据
How to valid input to matches data in CSV file
我使用的是 Ruby 2.7 以上版本。我一直在完成这项任务并且还在学习。我很确定我没有使用正确的代码。这个任务要求我做一个模拟 atm 程序。要求之一是我需要在用户访问程序之前检查用户有效输入是否与 CSV.file 中的数据匹配。
我正在使用 ruby(不允许使用 rails 或任何高级 ruby 代码)。我在任何地方搜索类似程序以供参考,但大多不涉及 CSV 文件。如何检查用户的输入是否有效并与 CSV 文件匹配?我在如何进行验证以及如何使用两个输入(用户名和密码)进行验证时遇到问题。这个程序在命令行上是 运行。如果我不够清楚,我深表歉意。你能从我的代码中告诉我哪里出错了吗?
我有三个 .rb 文件和两个 csv 文件。我不确定是否应该创建两个单独的 csv 文件。
- function.rb(所有函数所在)
- login.rb(在进入 system.rb 文件之前验证 'user.csv' 文件中的用户名和密码)
- system.rb(所有数据保存或更改的主要位置 'account.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
假设这是您的 users.csv
文件:
name,password
bob,1234
alice,5678
这是一种可能的选择。
将文件加载到哈希数组中 Enumerable#to_h and Hash#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 returns 非 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)
我使用的是 Ruby 2.7 以上版本。我一直在完成这项任务并且还在学习。我很确定我没有使用正确的代码。这个任务要求我做一个模拟 atm 程序。要求之一是我需要在用户访问程序之前检查用户有效输入是否与 CSV.file 中的数据匹配。
我正在使用 ruby(不允许使用 rails 或任何高级 ruby 代码)。我在任何地方搜索类似程序以供参考,但大多不涉及 CSV 文件。如何检查用户的输入是否有效并与 CSV 文件匹配?我在如何进行验证以及如何使用两个输入(用户名和密码)进行验证时遇到问题。这个程序在命令行上是 运行。如果我不够清楚,我深表歉意。你能从我的代码中告诉我哪里出错了吗?
我有三个 .rb 文件和两个 csv 文件。我不确定是否应该创建两个单独的 csv 文件。
- function.rb(所有函数所在)
- login.rb(在进入 system.rb 文件之前验证 'user.csv' 文件中的用户名和密码)
- system.rb(所有数据保存或更改的主要位置 'account.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
假设这是您的 users.csv
文件:
name,password
bob,1234
alice,5678
这是一种可能的选择。
将文件加载到哈希数组中 Enumerable#to_h and Hash#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 returns 非 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)