source: CMIP6dreqbuild/trunk/srcMisc/dreq_sfsn.py @ 323

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/srcMisc/dreq_sfsn.py@756
Revision 323, 7.1 KB checked in by mjuckes, 5 years ago (diff)

dreq misc

Line 
1import string
2from fcc_utils2 import snlist
3import xlrd, string, shelve, os, re, sys
4import collections
5import xlutils, xlwt
6import xlutils.copy
7import xlutils.styles
8####
9
10class wbcp(object):
11  def __init__( self, inbook ):
12    self.book = xlrd.open_workbook(inbook,formatting_info=True)
13    self.sns = self.book.sheet_names()
14    self.wb = xlutils.copy.copy(self.book)
15    ##self.book = xlrd.open_workbook(inbook,formatting_info=True)
16    self.plain = xlwt.easyxf('')
17    self.styles = xlutils.styles.Styles(self.book)
18
19  def _getOutCell(self, rowIndex, colIndex):
20    """ HACK: Extract the internal xlwt cell representation. """
21    row = self.currentSo._Worksheet__rows.get(rowIndex)
22    if not row: return None
23
24    cell = row._Row__cells.get(colIndex)
25    return cell
26
27  def putValue2(self, row, col, value):
28    """ Change cell value without changing formatting. """
29    # HACK to retain cell style.
30    previousCell = self._getOutCell( row, col)
31    # END HACK, PART I
32
33    self.currentSo.write(row, col, value)
34
35    # HACK, PART II
36    if previousCell:
37        newCell = self._getOutCell( row, col)
38        if newCell:
39            newCell.xf_idx = previousCell.xf_idx
40    # END HACK
41
42
43  def focus( self, name ):
44    self.currentIndex = self.sns.index(name)
45    if self.currentIndex == -1:
46      self.currentSi = None
47    else:
48      self.currentSi = self.book.sheet_by_name( name )
49      self.currentSo = self.wb.get_sheet( self.currentIndex )
50
51  def putValue(self,i,j,value):
52    ##self.currentSi.write(i,j,value,self.plain)
53    cell_style = self.styles[self.currentSi.cell(i,j)]
54    self.currentSo.write(i,j,value,cell_style)
55
56  def write(self,file='output.xls'):
57    self.wb.save( file )
58
59class tupsort:
60   def __init__(self,k=0):
61     self.k = k
62   def cmp(self,x,y):
63     return cmp( x[self.k], y[self.k] )
64
65def uniquify( ll ):
66  ll.sort()
67  l0 = [ll[0],]
68  for l in ll[1:]:
69    if l != l0[-1]:
70      l0.append(l)
71  return l0
72
73class workbook(object):
74  def __init__(self,file):
75    assert os.path.isfile(file), 'File %s not found' % file
76    self.book = xlrd.open_workbook( file )
77    self.sns = self.book.sheet_names()
78
79clabs = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
80def clab(n):
81  i = n/26
82  assert i < 26, 'Not ready for row number greater than 26*26'
83  if i == 0:
84    return clabs[n]
85  else:
86    return clabs[i-1] + clabs[ n - i*26]
87
88def getRow(sht):
89  ee = {}
90  for i in range(sht.nrows):
91    if sht.row(i)[0].ctype == 2 and str( sht.row(i)[0].value ) != '0.0':
92      l = map( lambda x: str( x.value ), sht.row(i) )
93      ##k = string.replace( l[5], ' ','')
94      k = l[5]
95      try:
96        ee[k] = l
97      except:
98        print l
99        raise
100  return ee
101   
102snli = snlist( dir='config/cf/' )
103sn,sna = snli.gen_sn_list()
104
105dir0 = '/home/martin/2014/wip/dreq/input/'
106file = 'PMIP/CMIP6DataRequestCompilationTemplate_20141218_PMIP_v150228_final.xls'
107file = 'C4MIP/CMIP6DataRequestCompilationTemplate_C4MIP_06March2015_submitted.xls'
108file = 'C4MIP/CMIP6DataRequestCompilationTemplate_C4MIP_06March2015_submitted.xlsx'
109
110wk = wbcp( dir0 + file )
111this = wk.book.sheet_by_name(u'New variables')
112wk.focus( u'New variables')
113ll = []
114rl = []
115for i in range(3,this.nrows):
116    r = this.row(i)
117    ll.append( str(r[1].value) )
118    rl.append( r )
119print '################################################'
120
121snd = collections.defaultdict( list )
122l0 = []
123for l in ll:
124  l0.append( (l,1) )
125  snd[l].append( 1 )
126for l in sn:
127  l0.append( (l,2) )
128  snd[l].append( 2 )
129for l in sna:
130  l0.append( (l,3) )
131  snd[l].append( 3 )
132
133ln = []
134kk = 3
135for l in ll:
136  print l, snd[l]
137  if len( snd[l] ) == 1:
138    ln.append( 'new' )
139    wk.putValue2( kk, 2, 'new' )
140  else:
141    if 2 in snd[l] or 3 in snd[l]:
142      ln.append( 'checked' )
143      wk.putValue2( kk, 2, 'checked' )
144      print '################ checked ###########',kk
145    else:
146      ln.append( 'new' )
147      wk.putValue2( kk, 2, 'new' )
148  kk += 1
149
150wk.write()
151oo = open( 'test.csv', 'w' )
152for i in range(len(ll)):
153  try:
154    x = map( lambda x: str(x.value), rl[i] )
155  except:
156    for c in rl[i]:
157      print c.value
158      print str(c.value)
159  print x
160  x[2] = ln[i]
161  s = string.join(x, '\t' ) + '\n'
162  oo.write(s)
163oo.close()
164 
165l0.sort( tupsort(0).cmp )
166 
167if __name__ == '__mainxxx__':
168    cmip5File = 'cmip5/standard_output.xls'
169    wk5 = workbook( cmip5File )
170    print wk5.sns
171    tabs = []
172    other = [u'general', u'dims', u'other output', u'CFMIP output']
173    for s in wk5.sns:
174      if s not in other:
175        tabs.append(s)
176    file = 'input/C4MIP/C4MIP_standard_output_CMIP5spreadsheet.xls'
177    if len(sys.argv) > 1:
178      file = sys.argv[1]
179    wk = workbook( file )
180    #for s in [u'Omon',u'Lmon']:
181    for s in tabs:
182     if s not in wk.sns:
183      print '%s omitted' % s
184     else:
185      this5 = wk5.book.sheet_by_name(s)
186      rd5 = getRow(this5)
187      thiss = wk.book.sheet_by_name(s)
188      rd = getRow(thiss)
189      ko = []
190      kk = []
191      for k in rd5.keys():
192        if rd.has_key(k):
193          if len(rd[k]) > 24:
194            lv = rd[k][24]
195            if lv in ['0.0','0']:
196              ko.append(k)
197            else:
198              kk.append(k)
199          else:
200            kk.append(k)
201        else:
202          ko.append(k)
203      print s,len(ko),len(kk)
204    sys.exit(1)
205    tl = []
206    egn = []
207    kk = 0
208    for i in range(2,185):
209      en = thiss.row(i)[2].value
210      m = thiss.row(i)[1].value
211      t = thiss.row(i)[3].value
212      vvv = map( lambda x: str(thiss.row(i)[x].value), range(13,23) )
213      vv = string.join( vvv, '.' )
214      en1 = string.replace(en, '_', '-' )
215      en2 = string.replace(en1, '/', '--' )
216      en3 = string.replace(en2, '.', '-' )
217      en4 = string.replace(en3, '(', '' )
218      en5 = string.replace(en4, ')', '' )
219      en6 = string.replace(en5, ' ', '-' )
220      en7 = string.replace(en6, '%', 'pct' )
221      if type(t) in ( type('x'), type( u'x') ):
222        t = int( string.split(t)[0] )
223      try:
224        tl.append( ( kk,en,en7,m,'%s-%s-%s' % (m,int(t),vv)) )
225        egn.append( '%s-%s-%s' % (m,int(t),vv) )
226      except:
227        print t,type(t)
228        raise
229      kk += 1
230
231    egn1 = uniquify( egn )
232    hh = collections.defaultdict( list )
233    bb = {}
234    for e in egn1:
235      k = string.split( e, '-' )[0]
236      hh[k].append(e)
237      bb[e] = '%s-%s' % (k, len(hh[k]) )
238
239    tl.sort( tupsort(2).cmp )
240    t = tl[0]
241    t1 = ( t[0], t[1], t[2], t[2], t[3],t[4] )
242    tl1 = [t1,]
243    mod1 = False
244    km = 0
245    for t in tl[1:]:
246      if t[2] == tl1[-1][2]:
247        if not mod1:
248          t1 = ( tl1[-1][0], tl1[-1][1], tl1[-1][2], '%s-%2.2i' % (tl1[-1][2],km+1), tl1[-1][4], tl1[-1][5] )
249          tl1[-1] = t1
250          km+=1
251        mod1 = True
252        t1 = ( t[0], t[1], t[2], '%s-%2.2i' % (t[2],km+1), t[3],t[4] )
253        tl1.append(t1)
254        km+=1
255      else:
256        t1 = ( t[0], t[1], t[2], t[2], t[3],t[4] )
257        tl1.append(t1)
258        mod1 = False
259        km = 0
260    tl1.sort( tupsort(0).cmp )
261    hhh = collections.defaultdict(  list)
262    for t in tl1:
263      k1 = bb[t[5]]
264      k0 = string.split( k1, '-' )[0]
265      if len(hhh[k0]) == 0 or hhh[k0][-1] != k1:
266        hhh[k0].append(k1)
267      assert len(t) == 6, 'T: %s' % str(t)
268      print ( '%s, %s, %s, %s, %s, ' % t[:5] ) + '%s-%s' % (k0,len( hhh[k0] ) )
269     
270
271
Note: See TracBrowser for help on using the repository browser.