Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Ruby-如何拆分数组以从文件中收集数据_Arrays_Ruby_File_Calculator - Fatal编程技术网

Arrays Ruby-如何拆分数组以从文件中收集数据

Arrays Ruby-如何拆分数组以从文件中收集数据,arrays,ruby,file,calculator,Arrays,Ruby,File,Calculator,我应该做一个程序,可以存储有关员工及其工资的信息。以及公司的项目,详细信息如下: 项目名称、所需工时以及它们用于定价的不同变量(两个项目的定价变量不同)。此外,我们还要求它计算一个新项目的价格,该项目将使用用户的输入 f = File.new("html24_projects.txt", "a+") class Project def initialize @project = Array.new end def co

我应该做一个程序,可以存储有关员工及其工资的信息。以及公司的项目,详细信息如下: 项目名称、所需工时以及它们用于定价的不同变量(两个项目的定价变量不同)。此外,我们还要求它计算一个新项目的价格,该项目将使用用户的输入

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
我的问题从这里开始,我不能分线。当用户插入“可变价格”时,我有第二个附加值,而不是小时数。 而不是所有输入的数字,程序只显示第一个。我曾尝试使用“string\u of_data”而不是“\u set\u 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"']
在剥离和拆分这些线之后,将得到如下数组

["Foobar Inc.", 1, 2, 3, "23"]
["Fizzbuzzsoft", 2, 34, "2"]
['"Foobar Inc."', ' 1', ' 2', ' 3', ' "23"']
这是一个包含五个元素的数组。问题是,然后将其分配给三个变量:

_company_name, _set_variable, _hours = array_of_data
三,≠5所以Ruby分配前三个数组元素并丢弃其余的

x, y, z = [1, 2, 3, 4, 5]
x == 1
y == 2
z == 3
您希望
\u set\u 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

请注意,您的代码存在的问题远不止这些;不一定是会导致bug的问题,但设计问题会使程序很难理解、修改和维护。当您学习更多Ruby时,尝试发现并修复这些缺陷。例如:

  • 项目由三部分组成:名称、变量列表和小时数。目前,您将所有这些存储在单个阵列中,这使得它们很容易混淆,也很难单独访问
  • 您的程序正在执行的操作称为序列化。这就是获取数据结构(项目)并从磁盘保存/加载它的时候。这是一个非常常见的任务,有许多现有的工具来处理它。编写自己的代码来实现这一点很棘手,而且容易出错(这就是为什么您会在这里!)
  • 您在很大程度上依赖字符串从用户获取输入。处理字符串输入的一种更健壮的方法是使用。这些允许更灵活地处理不正确的输入

请发表一篇文章。你考虑过写一本书吗?不过,说真的,这篇文章的篇幅有必要吗?这个问题不能再简单一点地概括一下吗?:)嗯,我不确定我是否理解这个问题:D,但是的,我会试试。给我几分钟:)这是我能总结的最好的了。。。它具有重要的功能和您需要的功能,以便运行它而不出现任何错误并检查问题。谢谢你,非常感谢!!我希望在被分配到这个项目之前,有人告诉我关于序列化的事情:D你真的帮了我很多。@AlinChiver没问题。如果这解决了您的问题,请继续并单击向上箭头,然后在我的答案顶部打勾。