| | |
| | | return str(v) |
| | | |
| | | |
| | | def pick_columns(cell, nrows, ncols): |
| | | """æè¡¨å¤´å
³é®åå®ä½åï¼åä¸å段å½ä¸å¤æ¬¡æ¶ï¼åâè¡å·æå°ãå
¶æ¬¡æ¯å½ä¸è¯æçâçé£ä¸ªã""" |
| | | hits = F.scan_fields(cell, nrows, ncols) |
| | | cols = {} |
| | | for f in FIELDS: |
| | | if f not in hits: |
| | | continue |
| | | best = sorted(hits[f], key=lambda h: (h[0], len(h[2])))[0] |
| | | cols[f] = F.colindex(best[1]) |
| | | return cols, hits |
| | | def pick_columns(cell, nrows, ncols, merges=None): |
| | | """æè¡¨å¤´å®ä½åï¼å«ä¸¤çº§è¡¨å¤´æ¶æ§ï¼ââå®ç°è§ æ ¼å¼æ¢æµ.py ç pick_columnsï¼ä¿è¯ä¸¤å¤å£å¾ä¸è´ã""" |
| | | return F.pick_columns(cell, nrows, ncols, merges, fields=FIELDS) |
| | | |
| | | |
| | | def parse_sheet(cell, nrows, ncols, city=None): |
| | | def parse_sheet(cell, nrows, ncols, city=None, merges=None): |
| | | """è§£æä¸å¼ å·¥ä½è¡¨ â (项ç®è¡å表, 段信æ¯, æ ¡éªä¿¡æ¯)""" |
| | | cols, hits = pick_columns(cell, nrows, ncols) |
| | | cols, hits = pick_columns(cell, nrows, ncols, merges) |
| | | namec = cols.get('项ç®åç§°') |
| | | if namec is None: |
| | | return [], {}, {} |
| | |
| | | bodies = [a.body] if a.body else ['客è¿ï¼å®¢è¿ç«ï¼', 'ç©æµï¼ç©æµååºï¼'] |
| | | md = '%dæ' % int(a.month.split('-')[1]) |
| | | |
| | | records, report = [], [] |
| | | records, report, checks = [], [], [] |
| | | report.append('# å¸å·ææ¥è§£ææ¥åï¼%sï¼' % a.month) |
| | | report.append('') |
| | | report.append('ï¼åªè¯»è§£æï¼ä¸è¡ä¸ä¸ªé¡¹ç®è¡ï¼æç»è§åå `.tsv`ï¼') |
| | |
| | | sel = F.pick_sheet(sheets, ym=ym) |
| | | if not sel: |
| | | report.append('| %s | ï¼æªéä¸å·¥ä½è¡¨ï¼ | | | | | |' % f[:44]) |
| | | checks.append({'åç±»': body_key, 'å¸å·': city_file or '', 'æä»¶': f, 'å·¥ä½è¡¨': '', |
| | | 'ç¶æ': 'æªéä¸å·¥ä½è¡¨', '项ç®è¡æ°': 0, 'ä¸è´æ§': 'â'}) |
| | | continue |
| | | nm, nr, nc, cell, _hits = sel |
| | | rows, seg, extra = parse_sheet(cell, nr, nc, city=city_file) |
| | | merges = F.sheet_merges(path).get(nm, []) |
| | | rows, seg, extra = parse_sheet(cell, nr, nc, city=city_file, merges=merges) |
| | | city = seg.get('å¸å·') or city_file or city_by_override(f) or '' |
| | | sums = {k: sum(num(r.get(k)) or 0 for r in rows) for k in NUM_FIELDS} |
| | | sub = extra.get('å°è®¡å计è¡') or {} |
| | | sub_txt, ok = [], 'â' |
| | | if not sub and extra.get('å¸å·è¡å¼'): |
| | | sub = {'R%s(å¸å·è¡)' % (seg.get('å¸å·è¡') or '?'): extra['å¸å·è¡å¼']} |
| | | tok = tval = None |
| | | if sub: |
| | | key, val = pick_total(sub) |
| | | tok, tval = key, val |
| | | sub_txt.append('%s=%s' % (key, '/'.join(pretty(val.get(k)) for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ¬æå®æ')))) |
| | | if len(sub) > 1: |
| | | sub_txt.append('ï¼å¦æ %d è¡å°è®¡/å计ï¼' % (len(sub) - 1)) |
| | | same = all(abs((val.get(k) or 0) - sums[k]) < 0.05 |
| | | for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ¬æå®æ')) |
| | | ok = 'â
ä¸è´' if same else 'â ï¸ ä¸ä¸è´' |
| | | ck = {'åç±»': body_key, 'å¸å·': city, 'æä»¶': f, 'å·¥ä½è¡¨': nm, 'ç¶æ': 'OK', |
| | | '项ç®è¡æ°': len(rows), 'å计è¡': '', 'ä¸è´æ§': ok, |
| | | 'åä½': ','.join('%s=%s' % (k, v) for k, v in (extra.get('åä½') or {}).items())} |
| | | for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ¬æå®æ'): |
| | | ck['æ±å_' + k] = sums[k] |
| | | if sub: |
| | | ck['å计è¡'] = tok |
| | | for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ¬æå®æ'): |
| | | ck['å计_' + k] = tval.get(k) |
| | | checks.append(ck) |
| | | report.append('| %s | %s | %s | %d | %s | %s | %s |' % ( |
| | | f[:44], nm[:14], city, len(rows), |
| | | '/'.join(pretty(sums[k]) for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ¬æå®æ')), |
| | |
| | | records.append(rec) |
| | | except Exception as e: |
| | | report.append('| %s | ï¼è§£æå¤±è´¥ï¼%s: %sï¼ | | | | | |' % (f[:44], type(e).__name__, str(e)[:60])) |
| | | checks.append({'åç±»': body_key, 'å¸å·': city_file or '', 'æä»¶': f, 'å·¥ä½è¡¨': '', |
| | | 'ç¶æ': 'è§£æå¤±è´¥ï¼%s: %s' % (type(e).__name__, str(e)[:80]), |
| | | '项ç®è¡æ°': 0, 'ä¸è´æ§': 'â'}) |
| | | report.append('') |
| | | |
| | | # å¸å·æ±æ»ï¼è·¨æä»¶åå¹¶åå¸å·ï¼ |
| | |
| | | *(pretty(s[f]) for f in ('æ»æèµ', 'èªå¼å§å»ºè®¾ç´¯è®¡', 'æ¬å¹´è®¡åæèµ', 'èªå¹´å累计', 'æ¬æå®æ')))) |
| | | report.append('') |
| | | |
| | | report.append('## åæºæä»¶è¯å«å°çåä½ï¼**æè¡¨å¤´å
³é®åå®ä½ï¼ä¸æ¯åºå®åå·**ï¼') |
| | | report.append('') |
| | | report.append('| åç±» | æä»¶ | å·¥ä½è¡¨ | 项ç®åç§° | æ»æèµ | èªå¼å§å»ºè®¾ç´¯è®¡ | æ¬å¹´è®¡åæèµ | èªå¹´å累计 | æ¬æå®æ |') |
| | | report.append('| --- | --- | --- | --- | --- | --- | --- | --- | --- |') |
| | | _key5 = ('项ç®åç§°', 'æ»æèµ', 'èªå¼å§å»ºè®¾ç´¯è®¡', 'æ¬å¹´è®¡åæèµ', 'èªå¹´å累计', 'æ¬æå®æ') |
| | | for ck in checks: |
| | | _cm = dict(kv.split('=', 1) for kv in (ck.get('åä½') or '').split(',') if '=' in kv) |
| | | report.append('| %s | %s | %s | %s |' % (ck.get('åç±»', ''), ck.get('æä»¶', '')[:34], ck.get('å·¥ä½è¡¨', '')[:12], |
| | | ' | '.join(_cm.get(k, 'â') for k in _key5))) |
| | | report.append('') |
| | | |
| | | ck_cols = ['åç±»', 'å¸å·', 'æä»¶', 'å·¥ä½è¡¨', 'ç¶æ', '项ç®è¡æ°', 'ä¸è´æ§', 'å计è¡', 'åä½', |
| | | 'æ±å_èªå¼å§å»ºè®¾ç´¯è®¡', 'æ±å_èªå¹´å累计', 'æ±å_æ¬æå®æ', |
| | | 'å计_èªå¼å§å»ºè®¾ç´¯è®¡', 'å计_èªå¹´å累计', 'å计_æ¬æå®æ'] |
| | | p_ck = os.path.join(out, 'è§£ææ ¡éª_%s.tsv' % a.month) |
| | | with io.open(p_ck, 'w', encoding='utf-8-sig') as fh: |
| | | fh.write('\t'.join(ck_cols) + '\n') |
| | | for c in checks: |
| | | fh.write('\t'.join(pretty(c.get(k, '')) if isinstance(c.get(k), float) else str(c.get(k, '')) |
| | | for k in ck_cols) + '\n') |
| | | print('æ ¡éªè®°å½æ° = %d' % len(checks)) |
| | | |
| | | cols = ['åç±»', 'å¸å·', 'æä»¶', 'å·¥ä½è¡¨', 'è¡å·', 'åºå·', 'åç±»'] + FIELDS |
| | | tsv = os.path.join(out, 'è§£æç»æ_%s.tsv' % a.month) |
| | | with io.open(tsv, 'w', encoding='utf-8-sig') as fh: |
| | |
| | | print('项ç®è¡å计 = %d' % len(records)) |
| | | print('wrote', p_md) |
| | | print('wrote', tsv) |
| | | print('wrote', p_ck) |
| | | |
| | | |
| | | if __name__ == '__main__': |