これは、リストの各人のドキュメントを出力するために使用されていました。ただし、特定の日付のリストで最も人気のある日時を決定するコードを追加したため、リストの最初の人に対して1つのドキュメントのみが出力されるようになりました。
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ドキュメントも生成します。
ありがとう!
CSVファイルを読み取るときは、内部ポインタを移動して1行ずつ読み取ります。ファイルの終わりに達すると、このポインタはそこにとどまるので、新しい行をフェッチしようとするたびに、ファイルを巻き戻さない限り、nilになります。したがって、コードは次の行で反復を開始しました。
contents.each do |row|
これにより、最初の行がフェッチされ、カーソルが次の行に移動しました。ただし、ループ内では、contents.map {...}
csvファイル全体を読み取り、ファイルの最後に呪いを残しました。したがって、これを修正するには、統計ビットをループの外側(ループの前または後)に移動し、2回目の反復の前にファイルを巻き戻す(カーソルをリセットする)必要があります。
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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加