#!/usr/bin/python # -*- coding: utf-8 -*- from pyiofload import * import os source_dir = 'xmls' def do_merge_races(xmlfile1, xmlfile2, class_remap=None, club_ko=None, fiso_code=0): race1 = Race() race2 = Race() race1.load_from_iofxml(filename_=xmlfile1, class_remap=class_remap, clubs_ko=club_ko, avoid_unk=True) race2.load_from_iofxml(filename_=xmlfile2, class_remap=class_remap, clubs_ko=club_ko, avoid_unk=True) # print(race1.name, race1.date) # print(race2.name, race2.date) classes1_set = set(race1.classes.keys()) classes2_set = set(race2.classes.keys()) classes_both = classes1_set & classes2_set # print(len(classes1_set), len(classes2_set), len(classes_both)) # print(classes1_set == classes2_set) if classes1_set != classes2_set: raise Exception('Different classes!') runners1_set = set(race1.runners.keys()) runners2_set = set(race2.runners.keys()) # print(len(runners1_set), runners1_set) # print(len(runners2_set), runners2_set) runners_both = runners1_set & runners2_set # print(len(runners_both)) runners_one_only = runners1_set - runners_both runners_two_only = runners2_set - runners_both # print(runners_one_only) # print(runners_two_only) for id_to_remove in runners_one_only: race1.runners.pop(id_to_remove, None) for id_to_remove in runners_two_only: race2.runners.pop(id_to_remove, None) runners1_set = set(race1.runners.keys()) runners2_set = set(race2.runners.keys()) # print(len(runners1_set), runners1_set) # print(len(runners2_set), runners2_set) combined_race = Race(fiso_code=fiso_code) combined_race.name = race1.name + '_' + race2.name combined_race.date = race2.date combined_race.classes = race2.classes combined_race.clubs = {**race1.clubs, **race2.clubs} combined_runners = {} for rid in runners_both: # print(race1.runners[rid]) # print(race2.runners[rid]) runner = Runner(name=race1.runners[rid].name, family=race1.runners[rid].family, fisoid=race1.runners[rid].fisoid, class_=race1.runners[rid].class_, club=race1.runners[rid].club, clubid=race1.runners[rid].clubid, sicard=race1.runners[rid].sicard, total=race1.runners[rid].time + race2.runners[rid].time ) combined_runners[rid] = runner # print(runner) combined_race.runners = combined_runners for cid, class_ in combined_race.classes.items(): class_.min = None class_.max = None class_.avg = 0.0 class_.tot_t = 0.0 both_runners = [rid for rid in class_.runnersid if rid in combined_race.runners] # print(both_runners) both_runners.sort(key=lambda x: combined_race.runners[x].time) # print(both_runners) class_.runnersid = both_runners if both_runners is None: continue for rank, rid in enumerate(class_.runnersid): r = combined_race.runners[rid] r.place = rank + 1 # print(r) if class_.min is None or class_.min > r.time: class_.min = r.time if class_.max is None or class_.max < r.time: class_.max = r.time class_.tot_t += r.time class_.avg = class_.tot_t / float(len(class_.runnersid)) # print(class_) return combined_race, race1, race2 if __name__ == '__main__': cf, r1, r2 = do_merge_races(os.path.join(source_dir, 'POC-1_2019109.xml'), os.path.join(source_dir, 'POC-2_2019110.xml')) for cid, c in cf.classes.items(): print(c.name) for rid in c.runnersid: r = cf.runners[rid] # print(r) tt = time.strftime('%H:%M:%S', time.gmtime(r.time)) t1 = time.strftime('%H:%M:%S', time.gmtime(r1.runners[rid].time)) t2 = time.strftime('%H:%M:%S', time.gmtime(r2.runners[rid].time)) print('{:2} {:15} {:15} tempo_totale: {} ({} {})'.format( r.place, r.name, r.family, tt, t1, t2) )