0

私が持っているもの

次のような特定の日の従業員とそのシフトのリストを含む .csv ファイルがあります。

Initials,Last,First,ShiftStart,ShiftEnd
BAB,Smith,Bob,10:00a,1:00p
JCJ,Jones,Jill,11:00a,3:00p
JIH,Hernandez,Jose,1:00p,4:00p
BAB,Smith,Bob,1:00p,3:00p
JIH,Hernandez,Jose,5:00p,9:00p
JCJ,Jones,Jill,3:00p,3:30p
JCJ,Jones,Jill,3:30p,5:00p
DJM,Martin,Dominique,8:00a,11:00a

1 人が複数のシフトを持つことができること、次のシフトの開始時刻が別のシフトの終了時刻と同じである場合と異なる場合があること、および各従業員が一意の識別子としてイニシャルで識別されることに注意してください (かぎ。)

私が欲しいもの

この .csv ファイルを統合して、従業員ごとに 1 行だけにしたいと考えています。その人が複数のシフトを持っている場合は、あるシフトの終了時刻が別のシフトの開始時刻と同じかどうかを確認し、それらのシフトを結合しますが、そうでない場合は、2 つの新しい列 2ndShiftStart と 2ndShiftEnd を追加して、そのデータをそこに配置します。

結果は次のようになります。

Initials,Last,First,ShiftStart,ShiftEnd,2ndShiftStart,2ndShiftEnd
BAB,Smith,Bob,10:00a,3:00p,,
JCJ,Jones,Jill,11:00a,5:00p,,
JIH,Hernandez,Jose,1:00p,4:00p,5:00p,9:00p
DJM,Martin,Dominique,8:00a,11:00a,,

たとえば、BAB は午前 10 時から午後 1 時まで、次に午後 1 時から午後 3 時まで勤務しているため、結果の .csv には午前 10 時から午後 3 時まで勤務していると表示されます。

4

1 に答える 1

1
#!/usr/bin/env python
import sys
##Initials,Last,First,ShiftStart,ShiftEnd
s='''BAB,Smith,Bob,10:00a,1:00p
JCJ,Jones,Jill,11:00a,3:00p
JIH,Hernandez,Jose,1:00p,4:00p
BAB,Smith,Bob,1:00p,3:00p
JIH,Hernandez,Jose,5:00p,9:00p
JCJ,Jones,Jill,3:00p,3:30p
JCJ,Jones,Jill,3:30p,5:00p
DJM,Martin,Dominique,8:00a,11:00a'''

db = {}
for line in s.split('\n'):
     Initials,Last,First,ShiftStart,ShiftEnd = line.split(',')
     if Initials in db:
         db[Initials][2].append((ShiftStart,ShiftEnd))
     else:
         db[Initials] = (Last,First,[(ShiftStart,ShiftEnd)])
for Initials,v in db.iteritems():
    Last,First,shifts = v
    sys.stdout.write(Initials + ',')
    sys.stdout.write(Last + ',' + First)
    for shift in shifts:
        ShiftStart,ShiftEnd = shift
        sys.stdout.write(',' + ShiftStart + ',' + ShiftEnd)
    sys.stdout.write('\n')

または、非常にオブジェクト指向のプログラムを実行することもできます。

import sys
##Initials,Last,First,ShiftStart,ShiftEnd
s='''BAB,Smith,Bob,10:00a,1:00p
JCJ,Jones,Jill,11:00a,3:00p
JIH,Hernandez,Jose,1:00p,4:00p
BAB,Smith,Bob,1:00p,3:00p
JIH,Hernandez,Jose,5:00p,9:00p
JCJ,Jones,Jill,3:00p,3:30p
JCJ,Jones,Jill,3:30p,5:00p
DJM,Martin,Dominique,8:00a,11:00a'''

class Shift(object):
    def __init__(self,ShiftStart,ShiftEnd):
        self.ShiftStart,self.ShiftEnd = ShiftStart,ShiftEnd
    def __str__(self):
        return '%s,%s' % (ShiftStart,ShiftEnd)

class Person(object):
    def __eq__(self, p):
        if self.Initials != p.Initials:
            return False
        if p.Last is not None and self.Last != p.Last:
            return False
        if p.First is not None and self.First != p.First:
            return False
        return True
    def __init__(self,Initials,Last,First):
        self.Initials,self.Last,self.First = Initials,Last,First
        self.Shifts = []
    def __str__(self):
        return '%s,%s,%s' % (self.Initials,self.Last,self.First)

def AddShift(people, person, shift):
    try:
        person = people[people.index(person)]
    except ValueError:
        people.append(person)
    person.Shifts.append(shift)

people = []
for line in s.split('\n'):
     Initials,Last,First,ShiftStart,ShiftEnd = line.split(',')
     AddShift(people, Person(Initials,Last,First), Shift(ShiftStart,ShiftEnd))

for person in people:
    print '%s,%s' %(person, ','.join(map(str,person.Shifts)))
于 2013-04-04T16:27:02.417 に答える