1
0
Files
coconut-leaf/assets/ics2csv.py

101 lines
3.0 KiB
Python
Raw Permalink Normal View History

import icalendar
def DumpComponentHeader(file, component):
fields = []
inclusiveUnitCounter = 0
fields += map(lambda x: x + ' - required', component.required)
fields += map(lambda x: x + ' - singletons', component.singletons)
for units in component.inclusive:
fields += map(lambda x: x + ' - inclusive{}'.format(inclusiveUnitCounter), units)
inclusiveUnitCounter += 1
fields += ('exclusive - name', 'exclusive - data')
fields += ('multiple', )
file.write(','.join(fields))
file.write('\n')
def DumpComponentData(file, component):
data = []
gotten_instance = None
for item in component.required:
gotten_instance = component.get(item)
if gotten_instance is not None:
data.append(AdvancedFormater(gotten_instance))
else:
data.append('')
for item in component.singletons:
gotten_instance = component.get(item)
if gotten_instance is not None:
data.append(AdvancedFormater(gotten_instance))
else:
data.append('')
for units in component.inclusive:
for item in units:
gotten_instance = component.get(item)
if gotten_instance is not None:
data.append(AdvancedFormater(gotten_instance))
else:
data.append('')
gotten_name = ""
gotten_data = ""
for item in component.exclusive:
gotten_instance = component.get(item)
if gotten_instance is not None:
gotten_name = item
gotten_data = AdvancedFormater(gotten_instance)
break
data.append(gotten_name)
data.append(gotten_data)
for item in component.multiple:
gotten_instance = component.get(item)
if gotten_instance is not None:
data.append('- {} -'.format(item))
data.append(AdvancedFormater(gotten_instance))
else:
data.append('')
file.write(','.join(data))
file.write('\n')
def AdvancedFormater(data):
if isinstance(data, icalendar.prop.vDDDTypes):
return str(data.dt)
else:
return str(data)
# read file
icsFile = open('test.ics', 'rb')
cal = icalendar.Calendar.from_ical(icsFile.read())
icsFile.close()
# analyse file
csvEvent = open('event.csv', 'w')
csvEventHeader = False
csvAlarm = open('alarm.csv', 'w')
csvAlarmHeader = False
eventCount = 0
alarmCount = 0
miscCount = 0
for component in cal.walk():
if component.name == 'VEVENT':
eventCount += 1
if not csvEventHeader:
DumpComponentHeader(csvEvent, component)
csvEventHeader = True
DumpComponentData(csvEvent, component)
elif component.name == 'VALARM':
alarmCount += 1
if not csvAlarmHeader:
DumpComponentHeader(csvAlarm, component)
csvAlarmHeader = True
DumpComponentData(csvAlarm, component)
else:
miscCount += 1
csvEvent.close()
csvAlarm.close()
print('Event count: {}\nAlarm count: {}\nMisc count: {}'.format(eventCount, alarmCount, miscCount))