| | |
| | | 2) å·¥ä½è¡¨å
æâè¡¨å¤´åºæ¯å¦å¸¦æ¬æå¹´ææ è®°âä¼å
ï¼åæå½ä¸åæ®µæ°æåï¼ |
| | | é¿å
åå°ç©ºæ¨¡æ¿è¡¨ / åå²æè¡¨ï¼å¦æ½æ±ãæåºãè¥é³ç夿工ä½ç°¿ï¼ï¼ |
| | | 3) 项ç®è¡å¤å®ï¼åç§°åé空ä¸ä¸æ¯å°è®¡/å计/åç±»è¡ï¼ä¸ææ°å¼éç¹ï¼èªå¼å§å»ºè®¾ç´¯è®¡çï¼ï¼ |
| | | å
¼å®¹âæ åºå·åâï¼éå·ï¼ä¸â缺åºå·âï¼æåº 7 æï¼ä¸¤ç§æ
åµã |
| | | å
¼å®¹âæ åºå·åâï¼éå·ï¼ä¸â缺åºå·âï¼æåº 7 æï¼ä¸¤ç§æ
åµï¼ |
| | | 4) å¸å·å段ï¼å
æ¾åºãå¸å·è¡ãï¼é¦ 5 åéæ°å¥½åªæ 1 个åå
æ ¼æ¯å¸å·åï¼åè¡å
¶ä½åå
¨ç©ºï¼ï¼ |
| | | ååªåç®æ å¸å·æ®µå
ç项ç®è¡ãæ¹åçåå °äº¤éç©æµâ¦è¡¨ç 88 è¡éï¼R11-R63 æ¯éèç |
| | | æ¦æ±åå²åºåï¼è¥ä¸æå¸å·åæ®µå°±ä¼ææ¦æ±çåå²é¡¹ç®å½æåå °çåè¿æ¥ï¼ |
| | | 5) éèè¡ / éèå·¥ä½è¡¨ä¸ä½ä¸ºå¤å®ä¾æ®ï¼é»ç³ç©æµ R10 æ¯éèè¡ï¼ä½å®æ¯ä¸æ¡çå®é¡¹ç®è¡ |
| | | ï¼é³æ°å¿ç¦å±±ç©æµä»å¨ä¸å¿ï¼ï¼ä¸å·²è®¡å
¥é»ç³å¸å·æ±æ»è¡ï¼å¿
é¡»åã |
| | | """ |
| | | import sys, os, io, re, argparse, datetime as _dt |
| | | |
| | |
| | | 'èªå¼å§å»ºè®¾ç´¯è®¡', 'æ¬å¹´è®¡åæèµ', 'èªå¹´å累计', 'æ¬æå®æ', 'å»ºè®¾é¶æ®µ', '形象è¿åº¦'] |
| | | BAD_NAME = ('å¡«æ¥åä½', 'ç¾ç« ', 'åä½è´è´£äºº', 'ç»è®¡è´è´£äºº', 'å®¡æ ¸', '说æ', '注ï¼', 'ææ¥', 'æ¥è¡¨', |
| | | 'åº å·', 'åºå·', '项ç®åç§°', '项ç®ä¸ä¸»') |
| | | |
| | | CITIES = ('æ¦æ±', 'é»ç³', 'åå °', '宿', 'è¥é³', 'éå·', 'èé¨', 'åæ', 'èå·', 'é»å', |
| | | 'å¸å®', 'éå·', 'æ©æ½', '仿¡', 'æ½æ±', '天é¨', 'ç¥åæ¶', 'æåº') |
| | | |
| | | |
| | | def city_segments(cell, nrows, ncols, maxc=5): |
| | | # å¸å·è¡ = é¦ maxc åéæ°å¥½åªæ 1 个åå
æ ¼æ¯å¸å·åï¼åè¡å
¶ä½å为空ï¼ã |
| | | # è¿å [(è¡å·1åº, å¸å·å), ...]ï¼å·²æè¡å·æåºã |
| | | segs = [] |
| | | for r in range(min(nrows, 800)): |
| | | vals = [norm(cell(r, c)) for c in range(min(ncols, maxc))] |
| | | hit = [i for i, v in enumerate(vals) if v in CITIES] |
| | | if len(hit) == 1 and sum(1 for v in vals if v) == 1: |
| | | segs.append((r + 1, vals[hit[0]])) |
| | | return segs |
| | | |
| | | |
| | | def city_of_text(text): |
| | | for c in CITIES: |
| | | if c in str(text or ''): |
| | | return c |
| | | return None |
| | | |
| | | |
| | | def norm(s): |
| | |
| | | return bool(re.match(r'^-?\d+(\.\d+)?$', norm(v))) |
| | | |
| | | |
| | | def profile(cell, nrows, ncols, hits): |
| | | def profile(cell, nrows, ncols, hits, city=None): |
| | | namecol = None |
| | | if '项ç®åç§°' in hits: |
| | | namecol = hits['项ç®åç§°'][0][1] |
| | | data_start = data_end = None |
| | | project_rows = 0 |
| | | groups = [] |
| | | segs = city_segments(cell, nrows, ncols) |
| | | if city is None and len({s[1] for s in segs}) == 1: |
| | | city = segs[0][1] |
| | | lo, hi, city_row = 1, 10 ** 9, None |
| | | if city: |
| | | for i, (rr, cc) in enumerate(segs): |
| | | if cc == city: |
| | | city_row, lo = rr, rr |
| | | hi = segs[i + 1][0] if i + 1 < len(segs) else 10 ** 9 |
| | | break |
| | | if namecol is not None: |
| | | nc = colindex(namecol) |
| | | anchors = [colindex(hits[k][0][1]) for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ»æèµ') if k in hits] |
| | | for r in range(min(nrows, 800)): |
| | | if not (lo <= r + 1 < hi): |
| | | continue |
| | | a = norm(cell(r, 0)) |
| | | name = norm(cell(r, nc)) |
| | | is_group = bool(re.match(r'^(ä¸|äº|ä¸|å|äº|å
)ã', a + name)) \ |
| | |
| | | project_rows += 1 |
| | | return dict(namecol=namecol, data_start=data_start, data_end=data_end, |
| | | project_rows=project_rows, groups=groups[:6], |
| | | city=city or '', city_row=city_row or '', segments=segs[:8], |
| | | header_rows=sorted({h[0] for v in hits.values() for h in v})) |
| | | |
| | | |
| | |
| | | for f in files: |
| | | p = os.path.join(d, f) |
| | | rec = dict(åç±»=body.split('ï¼')[0], æä»¶=f, å·¥ä½è¡¨='', 表头è¡='', æ°æ®èµ·='', æ°æ®æ¢='', |
| | | 项ç®è¡æ°=0, åç§°å='', åç»è¡='') |
| | | 项ç®è¡æ°=0, åç§°å='', åç»è¡='', å¸å·='', å¸å·è¡='', å¸å·æ®µ='') |
| | | file_city = city_of_text(f) |
| | | try: |
| | | sel = pick_sheet(open_sheets(p), ym=ym) |
| | | if sel: |
| | | nm, nr, nc, cell, hits = sel |
| | | pr = profile(cell, nr, nc, hits) |
| | | pr = profile(cell, nr, nc, hits, city=file_city) |
| | | rec.update(å·¥ä½è¡¨=nm, 表头è¡=','.join(map(str, pr['header_rows'])), |
| | | æ°æ®èµ·=pr['data_start'], æ°æ®æ¢=pr['data_end'], |
| | | 项ç®è¡æ°=pr['project_rows'], åç§°å=pr['namecol'] or '', |
| | | åç»è¡=';'.join('R%s:%s' % g for g in pr['groups'])) |
| | | åç»è¡=';'.join('R%s:%s' % g for g in pr['groups']), |
| | | å¸å·=pr['city'] or (file_city or ''), å¸å·è¡=pr['city_row'], |
| | | å¸å·æ®µ=';'.join('R%s:%s' % s for s in pr['segments'])) |
| | | for k in KEY: |
| | | if k in hits: |
| | | rec[k + 'å'] = hits[k][0][1] |
| | | except Exception as e: |
| | | rec['é误'] = '%s: %s' % (type(e).__name__, e) |
| | | rows.append(rec) |
| | | report.append(' %-46s sheet=%-12s 表头=%-12s æ°æ®=%s~%s 项ç®è¡=%-3s åç§°å=%s %s' |
| | | % (rec['æä»¶'][:46], str(rec['å·¥ä½è¡¨'])[:12], rec['表头è¡'], rec['æ°æ®èµ·'], |
| | | report.append(' %-46s sheet=%-12s å¸å·=%s@R%s 表头=%-12s æ°æ®=%s~%s 项ç®è¡=%-3s åç§°å=%s %s' |
| | | % (rec['æä»¶'][:46], str(rec['å·¥ä½è¡¨'])[:12], rec['å¸å·'], rec['å¸å·è¡'], |
| | | rec['表头è¡'], rec['æ°æ®èµ·'], |
| | | rec['æ°æ®æ¢'], rec['项ç®è¡æ°'], rec['åç§°å'], |
| | | ''.join('%s=%s ' % (k, rec.get(k + 'å', '-')) for k in KEY) |
| | | + (' [%s]' % rec['é误'] if rec.get('é误') else ''))) |
| | | cols = ['åç±»', 'æä»¶', 'å·¥ä½è¡¨', '表头è¡', 'æ°æ®èµ·', 'æ°æ®æ¢', '项ç®è¡æ°', 'åç§°å'] + [k + 'å' for k in KEY] + ['åç»è¡', 'é误'] |
| | | cols = ['åç±»', 'æä»¶', 'å·¥ä½è¡¨', 'å¸å·', 'å¸å·è¡', 'å¸å·æ®µ', '表头è¡', 'æ°æ®èµ·', 'æ°æ®æ¢', '项ç®è¡æ°', |
| | | 'åç§°å'] + [k + 'å' for k in KEY] + ['åç»è¡', 'é误'] |
| | | tsv = os.path.join(out, 'æ ¼å¼æ¢æµ_%s.tsv' % args.month) |
| | | with io.open(tsv, 'w', encoding='utf-8-sig') as fh: |
| | | fh.write('\t'.join(cols) + '\n') |