#!/usr/bin/env python data = """ 1 SN12 TRO 1 20:33 07:50 3.5 Drop Walk Work timekeeping vital; earlier Sunday 2 SN12 TRO 1 20:33 07:20 3.0 Walk - Work - 3 SN12 WSB 1 18:02 07:50 3.0 Walk - Work - 4 SN12 WSB 1 18:02 07:20 5.0 Walk - Work - 5 SN12 WSB 1 18:02 07:20 5.0 Walk - Work - 6 SN12 TRO 1 18:02 - 1.0 Walk - Work - 7 SN12 SWI 1 07:49 18:02 5.0 Walk - Work Better walking to station from McDonald's / Leekes 8 SN12 BRI 4 18:48 Taxi 0.05 Drop - Leis Later train please 9 SN12 BTH 1 07:49 18:48 5.0 Walk - Work - 10 SN12 SAL 2 19:15 - 0.05 Drop - Family - 11 SN12 SWI 1 16:37 19:15 0.2 Drive - Leis Keep the station open; more trains 12 SN12 CPM 1 10:02 15:45 2.0 Drop - Work - 13 SN12 SAL 1 15:45 07:50 5.0 Walk Drop Work - 14 SN12 CPM 1 14:40 ? 2.0 Walk - Pers - 15 SN12 CPM 1 14:40 ? 1.0 Walk - Pers - 16 SN12 TRO 1 15:45 10:02 5.0 Walk - Work Could do with toilets 17 SN12 FIT 1 06:36 16:37v 3.0 Drive - Edu Less cancels; more trains; toilet and cafe 18 SN12 BRI 1 15:45 Late 3.0 Walk - Leis - 19 SN12 ROM 1 16:37 10:02 0.15 Taxi - Work - 20 SN12 BRI 1 16:37 - 1.0 Walk Taxi Leis - 21 SN12 PAD 1 16:37 - 0.5 Drive - Leis - 22 SN12 CPM 1 12:03 ? 3.0 Walk - Work - 23 SN12 BTH 1 12:03 ? 0.05 Taxi - Busi - 24 SN12 BHM 1 12:36 ? 0.1 Walk Taxi Busi - 25 SN12 TRO 1 13:14 - 0.05 Walk Taxi Leis - 26 SN12 CPM 1 12:36 - 2.0 Walk - Edu - 27 SN12 BRI 1 12:36 - 0.1 Taxi - Leis - 28 SN12 PAD 1 12:36 ? 0.05 Walk - Leis - 29a SN12 CPM 1 12:36 15:45 0.1 Walk - Pers - 29b SN12 CPM 1 12:36 15:45 1.0 Walk - Pers - 30 SN12 SWI 1 10:02 Taxi 5.0 Walk - Work - 31 SN12 CPM 1 10:02 18:02v+ 1.0 Walk - Leis - 32 SN12 BTH 1 09:18 18:03v 0.05 Drop - Leis Nice to have coffee 33 SN12 CPM 1 10:02 18:02 0.35 Walk - Pers Bigger & more trains; TVM take cash 34 SN12 SWI 2 10:02 15:45v 0.2 Drive - Pers - 35 SN12 SWI 1 10:02 Car 0.4 Walk Drop Busi Last train too early; delays to first train; cash machine at station; generally pleased 36 SN12 PGN 1 10:02 ? 0.1 Taxi - Busi - 37 SN12 SWI 1 10:02 18:02v 0.2 Drive - Leis Very quiet today; car park full the other day 38 SN12 SWI 1 10:02 15:45v 0.5 Walk - ? - 39 SN12 BRI 1 10:02 15:45 0.5 Walk - Busi - 40 SN12 BRI 1 10:02 18:47 5.0 Walk - Work - 41 SN12 SWI 2 14:30 v 3.5 Walk - Pers N.B. 1 ********* 42 SN12 BTH 1 07:49 15:45v 2.0 Drive - Work - 43 SN12 SWI 1 07:49 18:02 3.5 Walk - Work - 44 SN12 SWI 1 07:49 18:02 5.0 Drop - Work - 45 SN12 BGN 1 07:49 18:02 2.0 Drive - Busi Destinations vary 46 SN12 CPM 1 07:49 18:02 5.0 Walk - Work - 47 SN12 SWI 1 07:50 18:02 3.0 Drive - Work - 48 SN12 SWI 1 07:49 18:02 5.0 Walk - Work - 49 SN12 FIT 1 07:49 Cycle 4.0 Cycle - Work - 50 SN12 BTH 1 09:18 14:38v 0.02 Drop - Busi - 51 SN10 BRI 1 09:18 - 0.02 Drop - Busi - 52 BA14 SWI 1 07:20 20:32 4.0 Drive - Work - 53 SN12 SWI 1 07:20 - 1.0 Drop - Work - 54 SN12 KYN 1 07:20 18:02 1.0 Walk - Work Walkway from Beanacre Road 55 SN12 CPM 1 07:49 18:03 4.0 Walk - Work - 56 SN12 SWI 1 07:49 18:02 4.0 Walk - Work (****; More peak trains e.g. 09:00 57 BA14 SWI 1 07:49 18:02 4.0 Drop - Work - 58 SN12 LHR 1 07:49 - 0.05 Walk - Busi - 59 SN12 CPM 1 07:49 Lift 5.0 Walk - Work - 60 SN10 CPM 1 07:49 15:45 5.0 Drop - Edu - 61 SN12 CPM 1 07:49 15:45 5.0 Drop - Edu - 62 SN12 SWI 1 07:20 18:02 5.0 Walk - Work - 63 SN12 TRO 1 06:36 18:47 5.0 Walk - Work - 64 SN12 WRH 1 06:36 16:37v 0.35 Drop - Busi - 65 SN12 CPM 2 07:20 18:02 5.0 Walk Taxi Work - 66 SN12 CPM 1 07:20 18:02 5.0 Walk - Work - 67 SN12 SWI 1 07:20 18:02 3.0 Drive - Work - 68 SN12 SWI 1 07:20 18:02 2.5 Cycle - Work Good to be able to take byke on train 69 SN12 CPM 2 07:20 15:45 5.0 Drop - Edu - 70 SN12 SWI 1 07:20 18:01 5.0 Drop - Edu - 71 SN12 CDF 1 07:20 19:15 2.0 Drive - Work -""" class survey: def factory(data): info = [] for svy in data.splitlines(): fol = svy.split("\t"); if len(fol) < 3: continue info.append(survey(*fol)) return info def __init__(self,*flds): names = ("id","local","remote","headcount","leaveTime","arriveTime", "frequency","localTravel","localAlternative","reason","andalso") self.raw = {} for k in range(len(names)): try: self.raw[names[k]] = flds[k] except: self.raw[names[k]] = None def get(self,what): return self.raw[what] if __name__ == "__main__": import sys import stations # No parameters - quick public summary if len(sys.argv) == 1: rz=[] for svy in data.splitlines(): fol = svy.split("\t"); if len(fol) < 3: continue fol[1] = fol[1][0:4] csv = ", ".join(fol) rz.append(" " + csv) rz.sort(key=lambda x:len(x)) print ("\n".join(rz)) sys.exit() answers = survey.factory(data) destinations = {} toStation = {} reason = {} foj = {} c = 0 for a in answers: goingto = a.get("remote") passengers = int(a.get("headcount")) destinations[goingto] = destinations.get(goingto,0) + passengers c += passengers method = a.get("localTravel") toStation[method] = toStation.get(method,0) + passengers why = a.get("reason") reason[why] = reason.get(why,0) + passengers often = a.get("frequency") foj[often] = foj.get(often,0) + passengers print("Destinations for",c,"passengers") toplace= list(destinations.keys()) toplace.sort() for p in toplace: print("{} {:22s} {:3d}".format(p,stations.sname[p],destinations[p])) print("\nHow people got to Melksham Station") for m in toStation.keys(): print("{:7s} {:2d}".format(m,toStation[m])) print("\nWhy people were travelling") for m in reason.keys(): print("{:7s} {:3d}".format(m,reason[m])) print("\nFrequency of Journeys (times per week)") ff = list(foj.keys()) ff.sort() for p in ff: print("{:7s} {:3d}".format(p,foj[p])) print("\nUser Comments") for a in answers: c = a.get("andalso") if c != "-": print ("\t",c)