Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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
Ruby on rails Ruby/Rails:在发现新人时循环浏览csv并设置标志的最佳方式_Ruby On Rails_Ruby_Csv - Fatal编程技术网

Ruby on rails Ruby/Rails:在发现新人时循环浏览csv并设置标志的最佳方式

Ruby on rails Ruby/Rails:在发现新人时循环浏览csv并设置标志的最佳方式,ruby-on-rails,ruby,csv,Ruby On Rails,Ruby,Csv,我觉得这是编程101的东西,但我要放下我的骄傲,寻求帮助。我有一个正在处理的CSV。这是一个样本 person_id, name, start_date 1111, busta, 1/1/14 1111, busta, 1/4/14 1111, busta, 1/7/14 2222, mista, 1/3/14 2222, mista, 1/1/14 2222, mista, 1/11/14 …这是我用来处理行的代码示例 def self.import(file) student_star

我觉得这是编程101的东西,但我要放下我的骄傲,寻求帮助。我有一个正在处理的CSV。这是一个样本

person_id, name, start_date
1111, busta, 1/1/14
1111, busta, 1/4/14
1111, busta, 1/7/14
2222, mista, 1/3/14
2222, mista, 1/1/14
2222, mista, 1/11/14
…这是我用来处理行的代码示例

def self.import(file)
  student_start_dates = Hash.new {|hsh, key| hsh[key] = [] }

CSV.foreach(file.tempfile, :headers => true) do |row|
  student_start_dates[row["person_id"]] << row["start_date"]
  #need something in the loop that says hey...when I find a new person_id send this array to the process method
  end
end

  def self.process(student)
    #process something like 1111 => ["1/1/14", "1/4/14", "1/7/14"]
  end
def self.import(文件)
student_start_dates=Hash.new{| hsh,key | hsh[key]=[]
CSV.foreach(file.tempfile,:headers=>true)do |行|
学生开始日期[行[“个人id”][“1/1/14”,“1/4/14”,“1/7/14”]
结束
因此,从数据中可以看出,每个学生都有多个与之相关的开始日期。我试图为每个学生建立一个开始日期数组。当我找到一个新的person\u id时,我需要用我的开始日期数组“做一些事情”。我的问题是,当我循环浏览csv中的每一行时,添加查找person_id变化的逻辑的最佳方式是什么?我知道我可以设置一些在person_id更改时设置的标志,然后根据该标志的状态处理我的开始日期数组,并重置标志。然而,我尝试过在没有太多运气的情况下实现它。或者当它这样做的时候,它感觉“脏”。只是希望一双新的眼睛能给我一些关于更干净代码的想法


我的问题很大一部分是设置一个标志的最佳方式,标志上写着“.当你找到一个新学生(新人id)时,然后调用process方法来找到最早的开始日期。

如果我理解正确,你试图得到一个类似于{1111=>[“1/1/14”,“1/4/14”,“1/7/14”],2222=>[…],的哈希值。”

如果是这样的话,您可以使用内置的CSV解析器,并在循环每一行时构造哈希

# Create the hash, the default value will be an array
student_start_dates = Hash.new {|hsh, key| hsh[key] = [] }

CSV.foreach(file_name, :headers => true) do |row|
  student_start_dates[row["person_id"]] << row["start_date"]
end
#创建哈希,默认值为数组
student_start_dates=Hash.new{| hsh,key | hsh[key]=[]
CSV.foreach(文件名:headers=>true)do |行|

学生开始日期[row[“person\u id”]]我想你的意思是
学生开始日期[row[“person\u id”]]我对我的问题做了一些编辑,试图让我的目标更明确。我不希望处理整个csv并创建一个巨大的嵌套数组,我希望一次只处理一个学生。一旦我得到1111=>[“1/1/14”,“1/4/14”,这是非常重要的1/7/14“],然后我将其发送到我的“进程”方法进行一些解析(查找最早的开始日期),然后我将其写入数据库,然后更多地写入下一组行(下一个学生)。这可能更安全(更干净)一次性处理文件,然后对生成的数据执行任何操作。我这样说是因为最好不要对csv文件中的数据采用任何顺序。一旦创建了student_start_dates散列,您可以将其循环发送到处理函数。例如,
student_start_dates.each{id,dates | student.process(id,日期)}