2014-04-28 51 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

相關問題