source: CMIP6dreqbuild/trunk/src/workbook/importVocab.py @ 876

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/workbook/importVocab.py
Revision 876, 5.0 KB checked in by mjuckes, 4 years ago (diff)

release candidate

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