Ruby - 我如何拆分数组以从文件中收集数据
Ruby - how can i split arrays to collect data from files
我应该制作一个程序来存储有关员工及其薪水的信息。以及公司的项目,详细信息如下:
项目名称、所需时间和用于定价的不同变量(两个项目永远不会相同)。此外,我们被要求让它计算一个新项目的价格,该项目将使用用户的输入。
f = File.new("html24_projects.txt", "a+")
class Project
def initialize
@project = Array.new
end
def company_name
puts "\nPlease enter the Company's name."
name_company = gets.chomp
@project.push(name_company)
end
我这里有一个大问题,因为出于某种原因,它不会作为字符串保存在文件中,例如["X", "25, 26, 27", "10"]。
它只保存为 ["X", 25, 26, 27, "10"],当我想拆分行时,这是一个很大的拖累
def set_variable
puts "Please enter as many variables as needed for calculating the pricing on this project."
puts "Press 0 to finalize"
variable_price = gets.chomp.to_i
@project.push(variable_price)
while
case variable_price
when 0
@project = @project[0..-2]
puts "Thank you for your input"
break
else
variable_price = gets.chomp.to_i
@project.push(variable_price)
end
end
end
def hours
puts "\nPlease enter the number of hours required for the project.
\n*Note that the number can be changed at any time if needed." #Idk how to make it happen, i mean, to be changed later
hours= gets.chomp
@project.push(hours)
end
def add_To_File
File.open("html24_projects.txt", "a+") do | f |
f.puts @project.to_s
end
end
end
def newProject
project = Project.new
project.company_name
project.set_variable
project.hours
project.add_To_File
end
def listProjects
File.foreach("html24_projects.txt") do | line |
string_of_data = line.chomp[1..-2]
array_of_data = string_of_data.split(',')
_company_name, _hours, _set_variable = array_of_data
puts _company_name
end
end
while true
puts
puts "1. Add a new project"
puts "2. List all projects"
puts "\nPress 0 to exit"
choice = gets.chomp.to_i
case choice
when 1
puts
newProject
when 2
puts
listProjects
puts "Check details about a specific project"
puts "*Please, when you search, use name as stated in the display"
project_to_search = gets.chomp
searched_project_found = false
File.foreach("html24_projects.txt") do | line |
string_of_data = line.chomp[1..-2]
array_of_data = string_of_data.split(',')
_company_name, _set_variable, _hours = array_of_data
我的问题从这里开始,我无法拆分线路。而不是时间,我有用户在插入 "variable prices" 时添加的第二个值。
而不是输入的所有数字,程序只显示第一个。我曾尝试使用 "string_of_data" 而不是“_set_variable”,但它只会显示整行,所以它也毫无意义...
if _company_name.strip[1..-2] == project_to_search
then
searched_project_found = true
puts "Project #{project_to_search}:"
puts "Requires #{_hours} hours."
puts "It has the following variables #{_set_variable}"
break
end
end
puts "\nUnfortunately we don't have any project with that name. \nEither you wrote it wrong, either we don't have such a project." unless searched_project_found
when 0
puts "Have a nice day!"
break
end
end
false
嗯,基本上就是这样。我无法按预期将信息保存在文件中,因此我无法在以后的代码中使用它们。我已经解释了他们应该如何得救以及实际情况如何。这个程序其实是运行,如果你愿意帮助一个贫困学生,你可以尝试一下:D
你的数据文件html24_projects.txt
看起来像这样
["Foobar Inc.", 1, 2, 3, "23"]
["Fizzbuzzsoft", 2, 34, "2"]
在你剥离和拆分这些行之后,你最终得到这样的数组
['"Foobar Inc."', ' 1', ' 2', ' 3', ' "23"']
这是一个包含五个元素的数组。问题是你然后将它分配给 three varialbes:
_company_name, _set_variable, _hours = array_of_data
3≠5 所以Ruby 分配前三个数组元素并丢弃其余元素。
x, y, z = [1, 2, 3, 4, 5]
x == 1
y == 2
z == 3
您希望_set_variable
获取第一个和最后一个之间的所有元素。为此,请使用 glob
x, *y, z = [1, 2, 3, 4, 5]
x == 1
y == [2, 3, 4]
z == 5
# in your case
_company_name, *_set_variable, _hours = array_of_data
请注意,您的代码存在的问题远不止于此;不一定是会导致错误的问题,而是 设计 使程序很难理解、修改和维护的问题。随着您了解更多 Ruby,请尝试查找并修复此类缺陷。例如:
- 一个项目由三部分组成:名称、变量列表和小时数。目前,您将所有这些存储在一个数组中,这使得它们很容易混淆并且难以单独访问
- 你的程序正在做的事情叫做序列化。那是当您从磁盘中获取数据结构(项目)并 save/load 时。这是一项非常常见的任务,并且有许多现有工具可以处理它。编写自己的代码来执行此操作很棘手且容易出错(这就是您来这里的原因!)
- 您非常依赖字符串来获取用户的输入。处理字符串输入的更稳健的方法是使用 regular expressions。这些允许更灵活地处理不正确的输入
我应该制作一个程序来存储有关员工及其薪水的信息。以及公司的项目,详细信息如下: 项目名称、所需时间和用于定价的不同变量(两个项目永远不会相同)。此外,我们被要求让它计算一个新项目的价格,该项目将使用用户的输入。
f = File.new("html24_projects.txt", "a+")
class Project
def initialize
@project = Array.new
end
def company_name
puts "\nPlease enter the Company's name."
name_company = gets.chomp
@project.push(name_company)
end
我这里有一个大问题,因为出于某种原因,它不会作为字符串保存在文件中,例如["X", "25, 26, 27", "10"]。 它只保存为 ["X", 25, 26, 27, "10"],当我想拆分行时,这是一个很大的拖累
def set_variable
puts "Please enter as many variables as needed for calculating the pricing on this project."
puts "Press 0 to finalize"
variable_price = gets.chomp.to_i
@project.push(variable_price)
while
case variable_price
when 0
@project = @project[0..-2]
puts "Thank you for your input"
break
else
variable_price = gets.chomp.to_i
@project.push(variable_price)
end
end
end
def hours
puts "\nPlease enter the number of hours required for the project.
\n*Note that the number can be changed at any time if needed." #Idk how to make it happen, i mean, to be changed later
hours= gets.chomp
@project.push(hours)
end
def add_To_File
File.open("html24_projects.txt", "a+") do | f |
f.puts @project.to_s
end
end
end
def newProject
project = Project.new
project.company_name
project.set_variable
project.hours
project.add_To_File
end
def listProjects
File.foreach("html24_projects.txt") do | line |
string_of_data = line.chomp[1..-2]
array_of_data = string_of_data.split(',')
_company_name, _hours, _set_variable = array_of_data
puts _company_name
end
end
while true
puts
puts "1. Add a new project"
puts "2. List all projects"
puts "\nPress 0 to exit"
choice = gets.chomp.to_i
case choice
when 1
puts
newProject
when 2
puts
listProjects
puts "Check details about a specific project"
puts "*Please, when you search, use name as stated in the display"
project_to_search = gets.chomp
searched_project_found = false
File.foreach("html24_projects.txt") do | line |
string_of_data = line.chomp[1..-2]
array_of_data = string_of_data.split(',')
_company_name, _set_variable, _hours = array_of_data
我的问题从这里开始,我无法拆分线路。而不是时间,我有用户在插入 "variable prices" 时添加的第二个值。 而不是输入的所有数字,程序只显示第一个。我曾尝试使用 "string_of_data" 而不是“_set_variable”,但它只会显示整行,所以它也毫无意义...
if _company_name.strip[1..-2] == project_to_search
then
searched_project_found = true
puts "Project #{project_to_search}:"
puts "Requires #{_hours} hours."
puts "It has the following variables #{_set_variable}"
break
end
end
puts "\nUnfortunately we don't have any project with that name. \nEither you wrote it wrong, either we don't have such a project." unless searched_project_found
when 0
puts "Have a nice day!"
break
end
end
false
嗯,基本上就是这样。我无法按预期将信息保存在文件中,因此我无法在以后的代码中使用它们。我已经解释了他们应该如何得救以及实际情况如何。这个程序其实是运行,如果你愿意帮助一个贫困学生,你可以尝试一下:D
你的数据文件html24_projects.txt
看起来像这样
["Foobar Inc.", 1, 2, 3, "23"]
["Fizzbuzzsoft", 2, 34, "2"]
在你剥离和拆分这些行之后,你最终得到这样的数组
['"Foobar Inc."', ' 1', ' 2', ' 3', ' "23"']
这是一个包含五个元素的数组。问题是你然后将它分配给 three varialbes:
_company_name, _set_variable, _hours = array_of_data
3≠5 所以Ruby 分配前三个数组元素并丢弃其余元素。
x, y, z = [1, 2, 3, 4, 5]
x == 1
y == 2
z == 3
您希望_set_variable
获取第一个和最后一个之间的所有元素。为此,请使用 glob
x, *y, z = [1, 2, 3, 4, 5]
x == 1
y == [2, 3, 4]
z == 5
# in your case
_company_name, *_set_variable, _hours = array_of_data
请注意,您的代码存在的问题远不止于此;不一定是会导致错误的问题,而是 设计 使程序很难理解、修改和维护的问题。随着您了解更多 Ruby,请尝试查找并修复此类缺陷。例如:
- 一个项目由三部分组成:名称、变量列表和小时数。目前,您将所有这些存储在一个数组中,这使得它们很容易混淆并且难以单独访问
- 你的程序正在做的事情叫做序列化。那是当您从磁盘中获取数据结构(项目)并 save/load 时。这是一项非常常见的任务,并且有许多现有工具可以处理它。编写自己的代码来执行此操作很棘手且容易出错(这就是您来这里的原因!)
- 您非常依赖字符串来获取用户的输入。处理字符串输入的更稳健的方法是使用 regular expressions。这些允许更灵活地处理不正确的输入