source: CMIP6dreqbuild/trunk/src/workbook/importRef.py @ 370

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/workbook/importRef.py
Revision 370, 4.7 KB checked in by mjuckes, 5 years ago (diff)

working namespace implementation for data request

Line 
1import xlrd, xml, os
2import utils_wb, uuid
3import xml.dom, xml.dom.minidom
4import collections, string, re
5
6empty=re.compile('^$')
7
8def test( x,m):
9  if not x:
10    print m
11  return x
12
13class lcm(object):
14  def __init__(self,a,b):
15    self.a = {}
16    self.b = {}
17    for i in a:
18      self.a[string.lower(i)] = i
19    for i in b:
20      self.b[string.lower(i)] = i
21
22class main(object):
23
24  def __init__(self,src,tmpl,srcV=None):
25    self.src=src
26    self.tmpl=tmpl
27    self.srcV=srcV
28   
29    fok = [test(os.path.isfile(src),'%s not found' % src),
30           test(os.path.isfile(tmpl),'%s not found' % tmpl) ]
31
32    assert all( fok), 'Required input file(s) missing'
33
34    wb = utils_wb.workbook( tmpl )
35    if srcV != None:
36      wbv = utils_wb.workbook( srcV )
37    print wb.sns
38
39    doc = xml.dom.minidom.parse( src  )
40    main = doc.childNodes[0]
41    xsn = []
42    ff = {}
43    for c in main.childNodes:
44      tag = c.nodeName
45      if tag != '#text':
46        xsn.append(tag)
47        il = []
48        for i in c.childNodes:
49          if i.nodeName == 'item':
50            il.append(i)
51        xx = dict( il[0].attributes.items() )
52        ff[string.lower(tag)] = (c,xx)
53   
54    print xsn
55    ee = {}
56    for s in wb.sns:
57      if s != 'Other':
58        ee[string.lower(s)] = s
59   
60    if srcV != None:
61      ee['var'] = 'var'
62    print '####',ee.keys()
63    ok = True
64    for k in ee.keys():
65      if not ff.has_key(k):
66        print '%s not found' % k
67        ok = False
68   
69    assert ok, 'Not all sheets allocated to vocabs'
70 
71    mdict = {}
72    ma = []
73    for k in ee.keys():
74      if k == 'var':
75        sh = wbv.book.sheet_by_name( 'Sheet1' )
76      else:
77        sh = wb.book.sheet_by_name( ee[k] )
78      hdgs = map( lambda x: x.value, sh.row(2) )
79      nf = []
80      l = lcm(ff[k][1].keys(),hdgs)
81      hmap = {}
82      hmapi = {}
83      for h in hdgs:
84        if h in  ['', u'__comment__'] or h[:2] == '__':
85          hmap[h] = None
86        elif string.lower(h) not in l.a.keys():
87          nf.append(h)
88        else:
89          hmap[h] = l.a[string.lower(h)]
90          hmapi[hmap[h]] = hdgs.index( h )
91      if len(nf) > 0:
92          print ff[k][0].nodeName, hmap, nf
93          ma.append( (k,nf) )
94          ok = False
95      mdict[k] = (hmap, hmapi)
96    assert ok, 'Not all sheet columns allocated to vocab attributes, %s' % str(ma)
97    for k in ee.keys():
98      if k == 'var':
99        sh = wbv.book.sheet_by_name( 'Sheet1' )
100      else:
101        sh = wb.book.sheet_by_name( ee[k] )
102      print k, ff[k][1].keys()
103      keys = ff[k][1].keys()
104      keys.sort()
105      lll = []
106      for i in range(3,sh.nrows):
107        these = map( lambda x: x.value, sh.row(i) )
108        ll = []
109        for k2 in keys:
110          if k2 in mdict[k][1].keys():
111            val = these[ mdict[k][1][k2] ]
112            if k == 'priority' and k2 == 'label':
113                  val = str( int(val) )
114          else:
115            val = '__unset__'
116          ll.append( '%s=%s' % (k2,val) )
117        lll.append(ll)
118
119      idk = 0
120      if len( lll) > 0:
121        dil = ff[k][0].getElementsByTagName('item')
122        for d in dil:
123          ff[k][0].removeChild(d)
124        for ll in lll:
125          idk += 1
126          item = doc.createElement( 'item' )
127          item.setAttribute( 'id', 'tmpid.%4.4i' % idk )
128          thisuuid = str( uuid.uuid1() )
129          item.setAttribute( 'uuid',  thisuuid )
130          for a in ll:
131            try:
132              t,v = string.split(a,'=', maxsplit=1)
133            except:
134              print a
135              raise
136            if v != '__unset__':
137              item.setAttribute( t, v )
138          ff[k][0].appendChild( item )
139       
140    ####
141    #### need to match headings to attribute labels.
142    #### read remaining rows in sheet
143    #### write output
144    #### validate xml
145    ####
146    #### google doc updated to match sheet names and attribute names to within case
147####
148    from xml.dom.minidom import Document
149    ##doc = Document()
150    ##for i in range(5):
151      ##item = doc.createElement( 'item' )
152      ##item.setAttribute( 'label', 'pytest%s' % i )
153      ##item.setAttribute( 'title', 'This is a pytest item [%s]' % i )
154      ##ff['institute'][0].appendChild( item )
155   
156    txt = doc.toprettyxml(indent='\t', newl='\n', encoding=None)
157    ##txt = ff['institute'][0].toprettyxml(indent='\t', newl='\n', encoding=None)
158    oo = open( 'trial.xml', 'w' )
159    lines = string.split( txt, '\n' )
160    for line in lines:
161      l = utils_wb.uniCleanFunc( string.strip(line) )
162      if empty.match(l):
163        continue
164      else: 
165        oo.write(l + '\n')
166    oo.close()
167    ##print txt
168
169sampleXml = '../framework/out/vocabSample.xml'
170src1 = '../../docs/CMIP6ReferenceVocabularies_src.xls'
171src1 = '../../docs/CMIP6ReferenceVocabularies_20150804.xls'
172srcV = '/home/martin/2014/ceda-cc/CCCC/trunk/ceda_cc/vlsc3.xls'
173m = main(sampleXml, src1)
Note: See TracBrowser for help on using the repository browser.