Package gmisclib :: Module fiat_merge
[frames] | no frames]

Source Code for Module gmisclib.fiat_merge

 1  #!/usr/bin/env python 
 2   
 3  import die 
 4  import fiatio 
 5  import g2_select 
 6  import dictops 
 7   
 8  DEBUG = 0 
 9   
10 -def merge(d1, d2, key1, key2, grab, unique=True):
11 m1 = {} 12 d = DEBUG 13 for datum1 in d1: 14 k = tuple( [datum1[t] for t in key1] ) 15 if d > 0: 16 die.info('Sample datum key1: %s' % str(k) ) 17 d -= 1 18 if unique and k in m1: 19 raise ValueError, "Key=%s seen multiple times in d1" % str(k) 20 dictops.add_dol(m1, k, datum1) 21 m2 = {} 22 d = DEBUG 23 for datum2 in d2: 24 k = tuple( [datum2[t] for t in key2] ) 25 if d > 0: 26 die.info('Sample datum key2: %s' % str(k) ) 27 d -= 1 28 if unique and k in m2: 29 raise ValueError, "Key=%s seen multiple times in d2" % str(k) 30 dictops.add_dol(m2, k, datum2) 31 32 33 o = [] 34 for k in m1.keys(): 35 if k in m2: 36 for a in m1[k]: 37 for b in m2[k]: 38 tmp = a.copy() 39 for (g_from, g_to) in grab: 40 tmp[g_to] = g2_select.evaluate(g_from, b) 41 o.append( tmp ) 42 return o
43 44 45 46 if __name__ == '__main__': 47 import sys 48 arglist = sys.argv[1:] 49 key = [] 50 unique = True 51 grab = [] 52 while arglist and arglist[0].startswith('-'): 53 arg = arglist.pop(0) 54 if arg == '--': 55 break 56 elif arg == '-key': 57 key1 = arglist.pop(0).split(',') 58 key2 = key1 59 elif arg == '-key1': 60 key1 = arglist.pop(0).split(',') 61 elif arg == '-key2': 62 key2 = arglist.pop(0).split(',') 63 elif arg == '-grab': 64 gcode = arglist.pop(0) 65 gout = arglist.pop(0) 66 grab.append( (gcode, gout) ) 67 elif arg == '-D': 68 DEBUG += 1 69 elif arg == '-multi': 70 unique = False 71 else: 72 die.die('Unknown flag: %s' % arg) 73 h1, d1, c1 = fiatio.read(open(arglist.pop(0), 'r')) 74 h2, d2, c2 = fiatio.read(open(arglist.pop(0), 'r')) 75 assert len(arglist) == 0 76 h2.update(h1) 77 o = merge(d1, d2, key1, key2, grab, unique) 78 fiatio.write(sys.stdout, o, c1 + c2, h2) 79