0

サードパーティのシステムは、保護者の教師の予約の HTML テーブルを生成します。

 Blocks    Teacher 1   Teacher 2   Teacher 3
3:00 pm      Stu A       Stu B
3:10 pm      Stu B                   Stu C
...
5:50 pm      Stu D       Stu A       Stu E

列の数は、予約している教師の数によって異なります。行数は、作成するスロットの数によって異なります。

最終結果は、次のような各教師のハッシュである必要があります。

{ name: "Teacher 1", email: "teacher.1@school.edu", appointments: [
  { start: "15:00", end: "15:08", attendees: [
    { name: "Stu A Parent 1", email: "stuap1@example.com" },
    { name: "Stu A Parent 2", email: "stuap2@example.com" }
  ] },
  { start: "15:10", end: "15:18", attendees: [
    { name: "Stu B Parent", email: "stubp@example.com" }
  ] },
  ...
  { start: "17:50", end: "17:58", attendees: [
    { name: "Stu D Parent 1", email: "studp1@example.com" },
    { name: "Stu D Parent 2", email: "studp2@example.com" }
  ] },
] },

各教師を行として ETL 処理するのが最も理にかなっていると思うので、今回は Numbers の行と列を入れ替えて、CSV として保存しました。

Blocks,3:00 pm,3:10 pm,...,5:50 pm
Teacher 1,Stu A,Stu B,...,Stu D
Teacher 2,Stu B,,...,Stu C
Teacher 3,Stu D,Stu A,...,Stu E

オフィスのスタッフが使用できるようにプロセス全体をできるだけシンプルにしようとしているので、Kiba (またはプレーン Ruby) で行と列の転置を行うことは可能ですか? 木場では、すべての行を処理し、教師ごとにハッシュを蓄積し、最後に各教師のハッシュを出力する必要があると思いますか?

4

2 に答える 2

1

次のスケジュールが与えられたとします。

schedule =<<~END
Blocks,15:00,15:10,15:55
Teacher 1,Stu A,Stu B,Stu C
Teacher 2,Stu B,Stu C,Stu A
Teacher 3,Stu C,Stu A,Stu B
END

必要なハッシュの配列を生成するには、追加情報が必要です。次も与えられたとします。

teacher_emails = {
  "Teacher 1"=>"teacher.1@school.edu",
  "Teacher 2"=>"teacher.2@school.edu",
  "Teacher 3"=>"teacher.3@school.edu"
}
parent_emails = {
  "Stu A"=> { "Parent 1"=>"stuap1@example.com",
              "Parent 2"=>"stuap2@example.com" },
  "Stu B"=> { "Parent"=>"stubp@example.com" },
  "Stu C"=> { "Parent 1"=>"stuapc@example.com",
              "Parent 2"=>"stuapc@example.com" }
}
mins_per_meeting = 8

その後、次のように処理します。

blks, *sched = schedule.split(/\n/)
blks
  #=> "Blocks,15:00,15:10,15:55"
sched
  #=> ["Teacher 1,Stu A,Stu B,Stu C",
  #    "Teacher 2,Stu B,Stu C,Stu A",
  #    "Teacher 3,Stu C,Stu A,Stu B"]
time_blocks = blks.scan(/\d{1,2}:\D{2}/).map do |s|
  hr, min = s.split(':')
  mins_from_midnight = 60*(hr.to_i) + min.to_i
  { start: "%d:%02d" % mins_from_midnight.divmod(60),
  { end: "%d:%02d" % (mins_from_midnight + mins_per_meeting).divmod(60),
end
  #=> [{:start=>"15:00", :end=>"15:08"},
  #    {:start=>"15:10", :end=>"15:18"},
  #    {:start=>"15:55", :end=>"16:03"},
sched.map do |s|
  teacher, *students = s.split(',')
  { name: teacher,
    email: teacher_emails[teacher],
    appointments: time_blocks.zip(students).map do |tb,stud|
      tb.merge(
        { student: stud,
          attendees: parent_emails[stud].map do |par_name, par_email|
            { name: par_name, email: par_email }
          end
        }
      )
    end    
  }
end
  #=> [{:name=>"Teacher 1", :email=>"teacher.1@school.edu",
  #     :appointments=>[
  #       {:start=>"15:00", :end=>"15:08",
  #        :student=>"Stu A",
  #        :attendees=>[
  #          {:name=>"Parent 1", :email=>"stuap1@example.com"},
  #          {:name=>"Parent 2", :email=>"stuap2@example.com"}
  #        ]
  #       },
  #       {:start=>"15:10", :end=>"15:18",
  #        :student=>"Stu B",
  #        :attendees=>[
  #          {:name=>"Parent", :email=>"stubp@example.com"}
  #        ]
  #       },
  #       {:start=>"15:55", :end=>"16:03",
  #        :student=>"Stu C",
  #        :attendees=>[
  #          {:name=>"Parent 1", :email=>"stuapc@example.com"},
  #          {:name=>"Parent 2", :email=>"stuapc@example.com"}
  #        ]
  #       }
  #     ]
  #    },
  #    {:name=>"Teacher 2", :email=>"teacher.2@school.edu",
  #     :appointments=>[
  #       {:start=>"15:00", :end=>"15:08",
  #        :student=>"Stu B",
  #        :attendees=>[
  #          {:name=>"Parent", :email=>"stubp@example.com"}
  #        ]
  #       },
  #       ....
于 2021-03-10T09:16:09.003 に答える