source: CMIP6dreq/trunk/src/workbook/importRef.py @ 346

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreq/trunk/src/workbook/importRef.py@346
Revision 346, 4.4 KB checked in by mjuckes, 6 years ago (diff)

various

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