2014-04-28 28 views
0

这用于输出列表中每个人的文档。但是,由于我添加了代码来确定给定日期列表中最受欢迎的日期时间&,因此它现在仅为列表中的第一个人输出一个文档。为什么它输出一个文件,当它用于输出多个?

def save_thank_you_letters(id,form_letter) 
    Dir.mkdir("output") unless Dir.exists?("output") 

    filename = "output/thanks_#{id}.html" 

    File.open(filename,'w') do |file| 
    file.puts form_letter 
    end 
end 

puts "EventManager initialized." 

contents = CSV.open 'event_attendees.csv', headers: true, header_converters: :symbol 

template_letter = File.read "form_letter.erb" 
erb_template = ERB.new template_letter 

contents.each do |row| 
    id = row[0] 
    name = row[:first_name] 
    zipcode = clean_zipcode(row[:zipcode]) 

    phone = clean_phonenumber(row[:homephone]) 

    legislators = legislators_by_zipcode(zipcode) 

    form_letter = erb_template.result(binding) 

    save_thank_you_letters(id,form_letter) 

# IT WORKS OK UNTIL I ADD THIS PART... 
    times = contents.map { |row| row[:regdate] } 
    target_times = Hash[times.group_by do |t| 
    DateTime.strptime(t, '%m/%d/%y %H:%M').hour 
    end.map do |k,v| 
    [k, v.count] 
    end.sort_by do |k,v| 
    v 
    end.reverse] 

    target_days = Hash[times.group_by do |t| 
    DateTime.strptime(t, '%m/%d/%y %H:%M').wday 
    end.map do |k,v| 
    [Date::ABBR_DAYNAMES[k], v.count] 
    end.sort_by do |k,v| 
    v 
    end.reverse] 
    puts target_times 
    puts target_days 
end 

我认为这与我处理日期/时间数据的方式有关。如果我删除它,我会为列表中的每个人获取一个html文档。但是,如果我包含它,我会得到我正在查找的日期&时间信息 - 但它仅为列表中的第一个人生成文档。

有人能解释为什么我所做的不起作用吗?我希望它能打印出一周中的时间和日期,但也为列表中的每个人生成一个html文档。

谢谢!

+0

? – BroiSatse

+0

@BroiSatse我移动了target_time&target_days,但它似乎仍然不起作用。现在,它不会为列表中的任何人生成任何文档。我无法理解是什么导致了这种冲突。我搬家了:times = contents.map {| row |行[:regdate]} .......放置target_days我将此移至erb_template = ERB.new之后template_letter – Robbie

回答

0

当您读取CSV文件时,您逐行读取它移动内部指针。一旦你到达文件末尾,这个指针就会保持在那里,所以每当你尝试获取新行时,你都会得到零,除非你倒退文件。所以,你的代码开始迭代在这条线上:

contents.each do |row| 

这提取了第一行并将光标移到下一行。但是在循环内部,您做了contents.map {...},它读取整个csv文件并在文件末尾留下诅咒。 因此,要解决它,你需要移动的统计比特循环(之前或之后)之外,第二迭代之前倒带文件(重置光标):为什么你计算环路内的统计

contents.each do |row| 
    id = row[0] 
    name = row[:first_name] 
    zipcode = clean_zipcode(row[:zipcode]) 

    phone = clean_phonenumber(row[:homephone]) 

    legislators = legislators_by_zipcode(zipcode) 

    form_letter = erb_template.result(binding) 

    save_thank_you_letters(id,form_letter) 

end 

contents.rewind 
times = contents.map { |row| row[:regdate] } 
target_times = Hash[times.group_by do |t| 
    DateTime.strptime(t, '%m/%d/%y %H:%M').hour 
end.map do |k,v| 
    [k, v.count] 
end.sort_by do |k,v| 
    v 
end.reverse] 

target_days = Hash[times.group_by do |t| 
    DateTime.strptime(t, '%m/%d/%y %H:%M').wday 
end.map do |k,v| 
    [Date::ABBR_DAYNAMES[k], v.count] 
end.sort_by do |k,v| 
    v 
end.reverse] 
puts target_times 
puts target_days 
+0

感谢您的出色解释。我没有意识到它会在最后停止,除非我在通过下一次迭代之前告诉它倒回到开始。谢谢! – Robbie

相关问题